leetcode_Find Minimum in Rotated Sorted Array II

来源:互联网 发布:杭州摄影俱乐部 知乎 编辑:程序博客网 时间:2024/06/03 20:49

描述:

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.

思路:

这道题由于要求对数的时间复杂度,所以考虑用二分查找,而二分查找需要数组是有序的。而本文所给的数组是循环移位后的有序数组,所以假设能够确定数字的顺寻就可以应用二分查找,本文的题眼也就在这里。由于所给的数据是循环移位后的有序数组,所以本数组至少有一半的元素是有序的,找出有序的那一般即可应用二分查找。

1.首先取mid=(start+end)/2,将arr[start]和arr[mid]比较,如果arr[start]==arr[mid],找到元素

2.如果arr[start]<arr[mid],则前半部分元素是有序的,由于前半部分有序,若arr[start]<=target<arr[mid],则假设元素存在则一定在前半部分,end=mid-1;若target>arr[mid],则元素如果存在,则存在后半部分,start=mid+1

3.如果arr[start]>arr[mid],则后半部分肯定有有序的,推理过程通上,balabala。。。

4.arr[start]==arr[mid],说明存在相同的元素,start=start+1;

5.while(start<=end),继续循环

代码:

public int findMin(List<Integer>nums) {int len = nums.size();int start = 0, end = len - 1;int mid = (start + end) / 2;int target = nums.get(mid);int min = findMinNum(nums, start, end, target);return min;}public int findMinNum(List<Integer>nums, int start, int end, int target) {    int startNum= nums.get(start),midNum=0;if (start == end)return target < startNum ? target : startNum ;int mid = (start + end) / 2;midNum=nums.get(mid);target=target<midNum?target:midNum;if (startNum  <midNum) {target = target < startNum? target : startNum ;start = mid + 1;} else if(startNum>midNum){    midNum=nums.get(mid+1);if(mid+1<=end)target=target<midNum?target:midNum;end=mid-1;}else    start=start+1;return findMinNum(nums, start, end, target);}


0 0