Search in Rotated Sorted Array II——LeetCode

Follow up for "Search in Rotated Sorted Array":
What if duplicates are allowed?

Would this affect the run-time complexity? How and why?

Write a function to determine if a given target is in the array.

这个题做了好长时间,到最后就这个想法。。。

 

后来看到别人真的做出来了,我于是又开始新的征程。。。终于顿悟了。。。

首先:

把左右两边的重复元素都过滤了。

while(lo<hi&&nums[lo]==nums[lo+1])lo++;
while(lo<hi&&nums[hi]==nums[hi-1])hi--;

然后开始思考一下rotated sorted array的特点:

有以下两种情况:

1 2 3 4 5 6 7 8 完全顺序的

5 6 7 8 1 2 3 4 反转的

lo = 0

hi = len - 1

mid = (lo+hi)>>>1

对于完全顺序的不用多说。

对于翻转的,这时mid会有两种情况:

一、nums[mid]>nums[hi]

二、nums[mid]<nums[hi]

ok,情况说明白了,下面来说target对应的情况:

如果target比nums[hi]大,那么在前半部分的情况有:

nums[hi]>nums[mid]或target<nums[mid]

如果target比nums[hi]小,那么在后部分的情况有:

target>nums[mid]或者nums[hi]<nums[mid]

 

     public boolean search(int[] nums,int target){
        if(nums==null||nums.length==0){
            return false;
        }
        int lo = 0, hi = nums.length-1;
        while(lo<=hi){
            while(lo<hi&&nums[lo]==nums[lo+1])lo++;
            while(lo<hi&&nums[hi]==nums[hi-1])hi--;
            
            int mid = (lo+hi)>>>1;
            if(target == nums[mid]){
                return true;
            }
            if(target>nums[hi]){
                if(nums[hi]>nums[mid]||target<nums[mid]){
                    hi=mid-1;
                }else{
                    lo=mid+1;
                }
            }
            else{
                if(target>nums[mid]||nums[hi]<nums[mid]){
                    lo=mid+1;
                }else{
                    hi=mid-1;
                }
            }
        }
        return false;
    }

 

posted @ 2015-09-17 21:09  丶Blank  阅读(167)  评论(0编辑  收藏  举报