题目
把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。输入一个递增排序的数组的一个旋转,输出旋转数组的最小元素。例如,数组
[3,4,5,1,2]
为[1,2,3,4,5]
的一个旋转,该数组的最小值为1。
自己的想法
- 我寻思这不就是求最小值吗?
class Solution {
public int minArray(int[] numbers) {
int min = numbers[0];
for(int i = 0;i<numbers.length;i++){
if(numbers[i]<min){
min = numbers[i];
}
}
return min;
}
}
-
但看了看讨论以及题解发现事情没那么简单~
-
有一些区别:这个数组是半有序,[3,4,5,1,2]这样子,总体无序前后两端都是有序的,所以有一些特殊的方法。
class Solution {
public int minArray(int[] numbers) {
// [3,4,5,1,2]
// [7,8,9,1,2,3,4,5,6]
int len = numbers.length;
int left = 0;
int right = len-1;
while(left<right){
int mid = (left + right) / 2;
if(numbers[mid] > numbers[right]){
// [3,4,5,1,2] mid以及mid的左边就不是最小的了,在右边
left = mid + 1;
}else if(numbers[mid]==numbers[right]){
// 中间和右边相等,舍弃右边
right--;
}else{
// numbers[mid] < numbers[right]
// [7,8,9,1,2,3,4,5,6] mid小于右边,最小值在左边,可能是mid
right = mid;
}
// System.out.println("left="+left);
// System.out.println("right="+right);
// System.out.println("mid="+mid);
}
// 最小值就在数组中,left、right以及mid都可以,不过mid不是全局变量,这个调用不到。
return numbers[left];
}
}
- 运行速度就不那么理想了