问题:
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.
思路一:同无重复元素数组一样,采用最简单的直接遍历,依次比较,不过这里时间复杂度不满足条件。
class Solution {
public int findMin(int[] nums) {
int len = nums.length;
int minIndex = 0;
for(int i = 1;i<len;i++){
if(nums[minIndex]>nums[i]){
minIndex = i;
}
}
return nums[minIndex];
}
}
思路二:同无重复元素数组一样,可以采用二分查找的算法,但由于存在重复元素,所以无法确定最小值是落在中间索引的哪一侧,对两侧分别查找,比较两侧查找的最小值。
class Solution {
public int findMin(int[] nums) {
int len = nums.length;
return dfs(nums,0,len-1);
}
private int dfs(int[]nums,int min,int max){
if(min==max){
return nums[min];
}
int mid = (min+max)/2;//中间索引值
int left = Integer.MAX_VALUE;
int right = Integer.MAX_VALUE;
if(nums[mid]>=nums[max]){
left = dfs(nums,mid+1,max);//可能落在右侧
}
if(nums[mid]<=nums[max]){//可能落在左侧
right = dfs(nums,min,mid);
}
return Math.min(left,right);//比较两侧查找出的值
}
}