Leetcode 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.
这道题和上道题不同之处在于这道题中的元素可以重复,那么如果仍然用上道题的解法就可能出现问题,即序列 1,0,1,1,1 和1,1,1,0,1这两个序列
num[lo]=num[mid]=num[hi] 无法判定mid是位于前面的递增数组中还是位于后面那个递增数组中,此时的情况就只能遍历从lo-hi的元素,查找最小的那个元素了
1 package Find.Minimum.in.Rotated.Sorted.Array.II; 2 3 /** 4 * @author dell 5 *这道题说题目中可能出现重复元素,因此不能像上道题那样解 6 */ 7 public class FindMinimuminRotatedSortedArrayII { 8 public int findMin(int[] num) { 9 if(num.length==1) return num[0]; 10 int lo=0; 11 int hi=num.length-1; 12 int mid=lo; 13 while(num[lo]>=num[hi]){ 14 if(hi-lo==1){ 15 mid=hi; 16 break; 17 } 18 mid=(lo+hi)/2; 19 if(num[mid]==num[lo]&&num[mid]==num[hi]){ 20 mid=this.minInOrder(num, lo, hi); 21 break; 22 } 23 if(num[mid]>=num[lo]) lo=mid; 24 else hi=mid; 25 } 26 return num[mid]; 27 } 28 private int minInOrder(int[] num,int lo,int hi){ 29 int result=num[lo]; 30 int index=lo; 31 for(int i=lo+1;i<=hi;i++){ 32 if(result>num[i]){ 33 result=num[i]; 34 index=i; 35 } 36 } 37 return index; 38 } 39 public static void main(String args[]){ 40 FindMinimuminRotatedSortedArrayII service=new FindMinimuminRotatedSortedArrayII(); 41 //int num[]={-1,-1,-1,-1}; 42 int num[]={3,3,1}; 43 //int num[]={1,1,3,1}; 44 int a=service.findMin(num); 45 System.out.println(a); 46 } 47 }
浙公网安备 33010602011771号