Find Minimum in Rotated Sorted Array II
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 a sorted array 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.
问题
“选择有序数组最小值”问题延伸:允许数组中有重复值。
这会影响时间复杂度吗?如何影响?为什么?
假设一个有序数组在某个未知中心旋转(如0 1 2 4 5 6 7可能变成4 5 6 7 0 1 2),找到数组中最小的元素。
数组中可能包含重复的元素。
思路
解题思路课参照Find Minimum in Rotated Sorted Array,当允许重复值时,不同之处是:
1. left == right时,无法判断是三种情况中的哪种,此时采用遍历方式。
2. left != right时,当left <= mid时,最小值在右边;当mid <= right时,最小值在左边。
代码(Java)
ublic class Solution {
public int findMin(int[] nums) {
return binarySearch(nums,0,nums.length-1);
}
public int binarySearch(int[] nums, int left , int right) {
int length = right - left;
if (length == 0) return nums[left];
if (length == 1) return (nums[left] > nums[right] ? nums[right] : nums[left]);
else {
if (nums[left] < nums[right]){
return nums[left];
} else if(nums[left] > nums[right]){
int mid = (left + right)/2;
if (nums[left] < nums[right]){
return nums[left];
} else if (nums[0] <= nums[mid] ){
return binarySearch(nums,mid,right);
} else {
return binarySearch(nums,left,mid);
}
} else {
for(int i = 1;i<nums.length;i++){
if(nums[i] < nums[i-1]){
return nums[i];
}
}
return nums[0];
}
}
}
}