154. 寻找旋转排序数组中的最小值 II
题目
假设按照升序排序的数组在预先未知的某个点上进行了旋转。
( 例如,数组 [0,1,2,4,5,6,7] 可能变为 [4,5,6,7,0,1,2])。
找到其中最小的元素。
注意数组中可能存在重复的元素。
示例 1:
输入: [1,3,5],
输出: 1
示例 2:
输入: [2,2,2,0,1],
输出: 0
思路
需要在无重复的旋转数组中注意一个地方:在middle 和 end 相等的时候,让 end 自减 1 即可;
代码
class Solution {
public int findMin(int[] nums) {
if (nums == null || nums.length == 0)
return 0;
int start =0;
int end = nums.length-1;
//第一个数小于最后一个数,说明是完全升序
if (nums[start]<nums[end])
return nums[start];
int middle=0;
while (start<=end){
middle = start +(end-start)/2; //需要保证不能 int 相加出现溢出
//让中位数和右边的数字比较
if (nums[middle]>nums[end]){
start = middle+1;
}
//如果 end = middle-1 的话,不能通过 {3,1,2}
else if (nums[middle]<nums[end]){
end = middle;//因为这里的 end 可能就是最小值,不能加一
}
//如果中间和最后相等。怎么查找,主要前后移动方向不确定
//无法确定的时候,让 右边的值自减就好了
else {
end--;
}
}
return nums[start];
}
}