LeetCode-33-搜索旋转排序数组

在这里插入图片描述

1、二分查找

由于题目要求O(logn)的时间复杂度进行查找数字,因此应当使用二分查找法。但考虑到数组中有一个未知的旋转下标,因此我们在使用二分查找时需要针对不同的情况进行讨论。

1、当nums[low] <= nums[mid]时,此时旋转下标一定落在mid之后。若此时我们需要查找的target落在nums[low]和nums[mid]的范围中间,则说明我们需要进行查找的是前半段数组,可以不用考虑旋转下标的位置,因此将mid作为上界。

2、当nums[low] > nums[mid]时,此时旋转下标一定落在mid之前,因此需要针对target与两端的值进行讨论。若此时target >= nums[low],说明此时target应落在low到旋转下标之间的位置上,需要将mid作为上界;若此时target <= nums[mid],说明此时target应落在旋转下标到mid之间的位置上,需要将mid作为上界。

3、除了以上两种情况以外,在其他情况下,target都落在mid后面的数组上,因此将mid作为下界即可。

class Solution {
public:
    int search(vector<int> &nums, int target) {
        int low = 0, high = nums.size() - 1;
        int mid;
        while (low < high) {
            mid = (low + high) / 2;
            if (nums[low] <= nums[mid] && target <= nums[mid] && target >= nums[low]) {
                high = mid;
            } else if (nums[low] > nums[mid] && (target >= nums[low] || target <= nums[mid])) {
                high = mid;
            } else {
                low = mid + 1;
            }
        }
        return (nums[low] == target) ? low : -1;
    }
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值