首页 > 其他 > 详细

Search in Rotated Sorted Array

时间:2015-09-13 12:02:00      阅读:169      评论:0      收藏:0      [点我收藏+]

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

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.



解法:

不含重复元素的排序数组,升序,旋转后,其为两个排序数组,A,B;B可能为空,如果为空,则整个数组为升序,A中的所有元素,比B中的要大。

注意A的末尾是转折点


left=0,right=size-1;mid=left+(right-left)/2   这里最好这样写,right+left 可能溢出

  1. nums[mid]==target  return mid

  2. nums[left]<=nums[mid]  这里存在等于号是因为left和mid 可能是同一个下标,这种情况,转折点在mid右边,可能包含mid

    a)如果nums[left]<=target&&target<nums[mid]  则right=mid-1  ,这种情况,说明target在A中,

    b)不满足a,则说明target在mid的右边,left=mid+1

  3. nums[left]>nums[mid]  这种情况下,转折点在mid的左边,

    a)如果nums[mid]<target&&nums[right]>=target  则left=mid+1;这种情况,说明target在B中或者,B为空,A为升序,(mid,right]里,

    b)不满足a,则说明target在mid的左边,自然right=mid-1


 int search(vector<int>& nums, int target) {

        int size=nums.size();

        if(size==0)

            return -1;

            

        int left=0,right=size-1;

        

        while(left<=right){

            int mid=left+(right-left)/2;//right+left may be overflow;

            if(nums[mid]==target)

                return mid;

            if(nums[left]<=nums[mid]){//这里包含等于,因为left和mid可能指向同一个元素,

                if(nums[left]<=target&&target<nums[mid]){

                    right=mid-1;

                }

                else

                    left=mid+1;

            }

            else{

                if(nums[mid]<target&&target<=nums[right])

                    left=mid+1;

                else

                    right=mid-1;

            }

        }

        return -1;

    }


Search in Rotated Sorted Array

原文:http://searchcoding.blog.51cto.com/1335412/1694218

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!