积少成多

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::

uppose 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).

You are given a target value to search. If found in the array return its index, otherwise return -1.

You may assume no duplicate exists in the array.

================

二分搜索

解决思路:

/**
012 3 4567
701 2 3456
670 1 2345
567 0 1234
456 7 0123
345 6 7012
234 5 6701
123 4 5670
*/

可以看到数组旋转的各种情况,mid将数组分为左右两部分

nums[mid]<nums[right],那么右边的部分是有序的

  因为右边部分有序,那么我可以在有序的部分判断:是否存在target值;如果有序的部分不存在target,那么在数组的左边部分寻找。

    我觉得这左右两部分的判断条件是不等价的,我们只能用排除法,先在有把握的部分搜索,这部分能找到更好。不能找到呢,换成另外的部分。

如果nums[mid] > nums[left],那么左边的部分是有序的。

  我们再在有序的部分寻找。。。。。

int search(const vector<int> &nums,int target){
        if(nums.size()==0)return -1;
        int left = 0;
        int right = nums.size()-1;
        while(left<=right){
            int mid = (left+right)/2;
            if(nums[mid]==target) return mid;
            else if(nums[mid]<nums[right]){
                ///the right part is sorted
                if(nums[mid]<target && nums[right]>=target)
                    left = mid+1;
                else
                    right = mid-1;
            }else{
                ///the left part is sorted
                if(nums[mid]>target && nums[left]<=target)
                    right = mid-1;
                else
                    left = mid+1;
            }
        }///while
        return -1;
    }

 

posted on 2016-06-07 11:23  x7b5g  阅读(225)  评论(0编辑  收藏  举报