0
点赞
收藏
分享

微信扫一扫

LeetCode 33. 搜索旋转排序数组**

盖码范 2022-02-16 阅读 185

基本思想:

主要难在判定条件上;

采用二分拆分,mid必定可以把序列分为两半,一半递增,一般先递增后递减或者先递减后递增;

如果前半段递增:
target小于mid,且target大于首个元素,则说明target足够小在后半段,否则在前半段;

如果后半段递增:
target大于mid,切target大于最后的元素,则说明target足够大,且在前半段,否则在后半段;

注意一下边界条件,即全递减序列;

具体代码:

class Solution {
public:
    int search(vector<int>& nums, int target) {
        if(nums.size()==0)
            return -1;
        int l=0,r=nums.size()-1;
        while(l<r){
            int mid=l+(r-l)/2;
            if(nums[mid]==target)
                return mid;
            if(nums[0]<=nums[mid]){
                //如果是递增序列,前半部分;
                if(target<nums[mid]&&target>=nums[0]){
                    r=mid-1;
                }else{
                    l=mid+1;
                }
            }else{
                //如果后半部分是递增序列;
                if(target>nums[mid]&&target<=nums[nums.size()-1]){
                    l=mid+1;
                }else{
                    r=mid-1;
                }
            }
        }
        if(nums[l]!=target)
            return -1;
        else
            return l;
    }
};
举报

相关推荐

0 条评论