0
点赞
收藏
分享

微信扫一扫

33. 搜索旋转排序数组

以前干嘛去了 2022-03-18 阅读 46

要求:找target
思路:二分
不完全二分,以rightleft判断

class Solution {
public:
    int search(vector<int>& nums, int target) {
        int n=nums.size();
        int left=0,right=n-1;
        while(left<=right){
            int mid=left+(right-left>>1);
            if(nums[mid]==target)return mid;
            else if(nums[mid]>target){
                if(nums[left]<target)right=mid-1;
                else if(nums[left]>target)++left;//在右边,但mid大于不能跳过
                else return left;
            }
            else if(nums[mid]<target){
                if(nums[right]<target)--right;//在左边,但mid小于不能跳过
                else if(nums[right]>target)left=mid+1;
                else return right;
            }
        }
        return -1;
    }
};

完全二分,以0和n-1判断

class Solution {
public:
    int search(vector<int>& nums, int target) {
        int n=nums.size();
        int left=0,right=n-1;
        while(left<=right){
            int mid=left+(right-left>>1);
            if(nums[mid]==target)return mid;
            if (nums[0] <= nums[mid]) {//mid在左边
                if (nums[0] <= target && target < nums[mid]) {//target也在左边,[0,mid-1]
                    right = mid - 1;
                } else {
                    left = mid + 1;
                }
            } else {//mid在右边
                if (nums[mid] < target && target <= nums[n - 1]) {//target也在右边,[mid+1,end]
                    left = mid + 1;
                } else {
                    right = mid - 1;
                }
            }
        }
        return -1;
    }
};
举报

相关推荐

0 条评论