Nameless Site

But one day, you will stand before its decrepit gate,without really knowing why.

0%

寻找旋转数组中的最小值II

来源Leetcode第154题寻找旋转数组中的最小值II

假设按照升序排序的数组在预先未知的某个点上进行了旋转。

( 例如,数组 [0,1,2,4,5,6,7] 可能变为 [4,5,6,7,0,1,2] )。

请找出其中最小的元素。

注意数组中可能存在重复的元素。

示例 1:

1
2
输入: [1,3,5]
输出: 1

二分查找

思路同上一题153,只是在判断相等时直接舍弃即可。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
public int findMin(int[] nums) {
int left=0,right=nums.length-1;
while (left <= right && nums[left] >= nums[right]) {
int mid = (left+right) >>> 1;
if (nums[mid] > nums[right]){
left = mid+1;
} else if (nums[mid] < nums[right]){
right = mid;
}
else
right--;

}
return nums[left];
}

去重

可以做一个预处理,保证所有重复数字不在两段里出现即可,再简单化,也就是保证切割的位置不要是重复数字。也就是比较 startend 是否相同,相同的话 end-- 即可。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
public int findMin(int[] nums) {
int start = 0;
int end = nums.length - 1;
while (nums[end] == nums[start] && end > start) {
end--;
}
while (start < end) {
int mid = (start + end) >>> 1;
if (nums[mid] > nums[end]) {
start = mid + 1;
} else{
end = mid;
}
}
return nums[start];
}