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 }

 

posted on 2015-03-06 13:12  Chris兔的小佳佳  阅读(136)  评论(0)    收藏  举报