33. Search in Rotated Sorted Array Medium

这道题要在一个已排序的、循环过一段的数组中找一个target。主要思想还是实现O(logn) 的二分查找,先看mid处的值是否是就是target,如果不是,在看a[mid]否比high处的值小,如果小,那么数组的最小值就在左半部分(已排序,没有循环的正常数组也是这种情况),否则就是在右半部分。如果最小值在左半部分,则此时右半部分是一个正常的递增的数组,target如果大于a[mid],则它在右半部分,跟普通情况相同的做法即可。反之,在左半部分,然后问题就变成了处理左半部分的子问题,下一个循环再解决就好。如果数组的最小值在右半部分,做法相似。

class Solution {
public:
    
    int search(vector<int>& nums, int target)
    {
        if(nums.empty())return -1;
    int low = 0, high = nums.size() - 1;
    while(low <= high){
    int mid = (low + high) / 2;
    if(nums[mid] == target)return mid;
    if(nums[mid] > nums[high]){ //检查最小值是否在右半部分 如 3,4,5,1,2
    if(target >= nums[low] && target < nums[mid]) high = mid - 1; //如果target在 3, 4, 5的部分
    else low = mid + 1;
    }
    else if(nums[mid] < nums[high]){ //检查最小值是否在左半部分 如  5,1,2,3,4
    if(target <= nums[high] && target > nums[mid]) low = mid + 1;  //如果target在2,3,4的部分
    else high = mid - 1;
    }
    else return -1;  // 防止数组只有一个值,此时nums[mid] = nums[low] = nums[high],一般情况下mid的值不会跟high的值相等
    }
    return -1;
    }
};

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值