代码:
复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106package com.niuke; /** * 旋转数组找最小值延伸:【旋转数组寻找最大值】 * */ public class A04_ReverseArrayMax { public static void main(String[] args) { //以向左旋转为例,类型分为:1.递增型小于半数旋转的旋转数组;2.多于半数旋转的递增数组;3.递减数组小于半数旋转的;4.递减数组多于半数旋转的;以下依次是4种类型旋转数组 //规则:中间的数mid与两端的数做差。如果两端的小,差值绝对值大的,最小值就在那一侧;并且还有一个规律,就是两端会同时比中间大,或者同时比中间小。 int[] arr = {8,10,11,14,17,18,23,2,5}; int[] arr0 = {17,18,19,26,3,5,8,10,11,14,15}; int[] arr1 = {14,11,10,8,6,5,2,21,18,17}; int[] arr2 = {5,2,25,18,17,14,11,10,8,6}; A04_ReverseArrayMax max = new A04_ReverseArrayMax(); System.out.println(max.maxNumberInRotateArray(arr)); System.out.println(max.maxNumberInRotateArray(arr0)); System.out.println(max.maxNumberInRotateArray(arr1)); System.out.println(max.maxNumberInRotateArray(arr2)); } public int maxNumberInRotateArray(int [] array) { if (array.length <= 0 || array == null){ return 0; } int left = 0,right = array.length-1,mid = 0; //保证旋转 while (array[left] >= array[right]){ //左右指针相邻停止 if (right - left == 1){ mid = left; //循环终止 break; } /** * 如果中间值和首尾相等,则按顺序寻找最小值 * or mid = (left + right)/2 * * mid = (left + right)/2; */ mid = left + (right - left)/2; if (array[left] == array[right] && array[right] == array[mid]){ return maxArray(array,left,right); } /** *如果中间值大于等于左边指针,则位于第一个递增数组中,最小元素位于中间元素的前面,改变左指针 * 否则最小元素位于后数组中,最小元素位于中间数组的后面,改变右指针继续 */ if (array[mid] >= array[left]){ left = mid; }else{ right = mid; } } while (array[left] <= array[right]){ //左右指针相邻停止 if (right - left == 1){ mid = right; //循环终止 break; } /** * 如果中间值和首尾相等,则按顺序寻找最小值 * or mid = (left + right)/2 * * mid = (left + right)/2; */ mid = left + (right - left)/2; if (array[left] == array[right] && array[right] == array[mid]){ return maxArray(array,left,right); } /** *如果中间值大于等于左边指针,则位于第一个递增数组中,最小元素位于中间元素的前面,改变左指针 * 否则最小元素位于后数组中,最小元素位于中间数组的后面,改变右指针继续 */ if (array[mid] >= array[right]){ right = mid; }else{ left = mid; } } return array[mid]; } private int maxArray(int[] array, int left, int right) { int max = array[left]; for (int i=left+1;i<array.length;i++){ if (array[i] > max){ max = array[i]; } } return max; } }
输出结果:
复制代码
1
2
3
4
523 26 21 25
最后
以上就是会撒娇小笼包最近收集整理的关于3.旋转数组求最大值的全部内容,更多相关3内容请搜索靠谱客的其他文章。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复