Description:
Follow up for "Find Minimum in Rotated Sorted Array":
What if duplicates are allowed?
Would this affect the run-time complexity? How and why?
Suppose an array sorted in ascending order is rotated at some pivot unknown to you beforehand.
(i.e., 0 1 2 4 5 6 7 might become 4 5 6 7 0 1 2).
Find the minimum element.
The array may contain duplicates.
问题描述:
假设一个排好序的数组在某个下标处旋转了,找出最小元素(数组允许重复元素)
这题是153的后续题,变化处在于允许有重复元素
先看看153题的解法:
/*
二分查找
*/
class Solution {
public int findMin(int[] nums) {
int left = 0, right = nums.length - 1;
if (nums[left] < nums[right]) {
return nums[left];
}
while(left < right - 1) {
int middle = (left + right) / 2;
if (nums[middle] >= nums[left]) {
left = middle;
} else {
right = middle;
}
}
return nums[right];
}
}
再来看看这一题的解法
class Solution {
public int findMin(int[] nums) {
int lo = 0;
int hi = nums.length - 1;
int mid = 0;
while(lo < hi) {
mid = lo + (hi - lo) / 2;
//大于的话,解必在右边
if (nums[mid] > nums[hi]) {
lo = mid + 1;
//小于的话,可以作为候选解
}else if (nums[mid] < nums[hi]) {
hi = mid;
//等于,不知道左右
}else { // when nums[mid] and nums[hi] are same
hi--;
}
}
return nums[lo];
}
}