首页 > 其他 > 详细

leetcode No33. Search in Rotated Sorted Array

时间:2016-08-02 19:25:20      阅读:326      评论:0      收藏:0      [点我收藏+]

Question:

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.

Algorithm:

先找顺序,再找target
有三种情况:(至少有一半是顺序的)
1、nums[mid]==target
2、nums[first]<nums[mid](左半是顺序,如果target在范围内,二分,如果不在,则在右半找顺序,即重复1,2,3)
3、nums[first]>=nums[mid](右半是顺序,如果target在范围内,二分,如果不在,则在左半找顺序,则重复1,2,3)  

Accepted Code:  

/* 
     旋转数组只能有三种情况: 
     1. 左半部分和有半部分都是按顺序的。旋转主元恰好是中间的数字。 
     2. 只有左半部分是按顺序的。旋转主元在左半部分。 
     3. 只有右半部分是按顺序的。旋转主元在右半部分。 
     所以至少有一半是按顺序的,可以用排除法确定每一次二分查找的 
     上界和下界。 
     1. 左半部分是按顺序 
     2. 左半部分不是按顺序的,那么右半部分肯定是按顺序的 
     不断缩小范围。 
*/  
class Solution {     
public:
    int search(vector<int>& nums, int target) {
        int res=-1;
        int l=0;
        int r=nums.size()-1;
        int mid=0;
        while(l<=r)
        {
            int mid=l+(r-l)/2;
            if(nums[mid]==target)
                return mid;
            else if(nums[l]<nums[mid])          //mid左边是顺序
            {
                if(nums[l]<=target&&nums[mid-1]>=target)   
                    r=mid-1;
                else
                    l=mid+1;
            }
            else                                   //mid右边是顺序
            {
                if(nums[mid+1]<=target&&nums[r]>=target)   
                    l=mid+1;
                else 
                    r=mid-1;
            }
        }
        if(nums[mid]==target)
            return mid;
        else 
            return -1;
    }
};



leetcode No33. Search in Rotated Sorted Array

原文:http://blog.csdn.net/u011391629/article/details/52095973

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