154-寻找旋转排序数组中的最小值 II
1.1题目描述
假设按照升序排序的数组在预先未知的某个点上进行了旋转。( 例如,数组 [0,1,2,4,5,6,7] 可能变为 [4,5,6,7,0,1,2] )。请找出其中最小的元素。注意数组中可能存在重复的元素。
示例 1:
输入: [1,3,5]
输出: 1
输入: [2,2,2,0,1]
输出: 0
1.2解析
首先最容易想到的就是暴力解法,遍历一遍数组找到最小值就好了。进阶的解法就是二分法。不过二分法需要注意:如何判断左右边界的移动
- 当 numbers[mid] > numbers[right]时: mid一定在左排序数组中,因此执行 left = min+1;
- 当 numbers[mid] > numbers[right] 时: mid一定在右排序数组中,因此执行 right= min;
- 当 numbers[mid] == numbers[right] 时: 无法mid在哪个排序数组中,执行 right =right-1缩小判断范围;
1.3代码
暴力解法
package solution;
/**
* @author xgj
*/
public class Solution {
public int minArray(int[] numbers) {
int min = Integer.MAX_VALUE;
for(int value : numbers){
min = Math.min(min,value);
}
return min;
}
}
二分法解法
package solution;
/**
* @author xgj
*/
public class Solution {
public int minArray(int[] numbers) {
int left = 0;
int right = numbers.length-1;
while(left<right){
int mid = left+(right-left)/2;
if (numbers[mid] > numbers[right]) {
left= mid + 1;
} else if (numbers[mid] < numbers[right]) {
right = mid;
} else {
right--;
}
}
return numbers[left];
}
}