您的位置:首页 > 其它

字符串算法——查找有序数组旋转后最小值(有重复元素)(Find Minimum in Rotated Sorted Array II)

2017-10-14 09:21 766 查看
问题:

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);//比较两侧查找出的值
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
相关文章推荐