[Leetcode]_33 Search in Rotated Sorted Array

/**
 *  Index: 33
 *  Title: Search in Rotated Sorted Array
 *  Author: ltree98
 **/


这道题,刚开始没看懂。
给定一个增序数组被旋转的数组,查找某个数在这个数组的位置,没有返回-1。
假定被查找的数在数组内最多有一个。

它的意思是,给一个数组,然后数组会被预先旋转一下,然后找数。
那么问题来了,给的数组A,旋转后数组B。
返回的序列号是数字在A的序列号,还是在B的序列号呢?
虽然,参数传入的是B数组,但是因为是增序数组,所以,可以推导出原数组A。

于是,折腾了一下,用 O(n) 的暴力查找。


class Solution {
public:
    int search(vector<int>& nums, int target) {
        for(int i = 0; i < nums.size(); i++)    {
            if(nums[i] == target)
                return i;
        }
        return -1;
    }
};


发现A了,证明,找的是旋转后数组的序列号。
为了进一步证明,用了普通的二分查找。


class Solution {
public:
    int search(vector<int>& nums, int target) {
        int l = 0, h = nums.size()-1;
        int m = (l+h)/2;

        while(l <= h)   {
            if(nums[m] > target)
                h = m-1;
            else if(nums[m] < target)
                l = m+1;
            else
                return m;
            m = (l+h)/2;
        }

        return -1;
    }
};


发现,卡在了[3,1] - WA。
再次证明是找旋转后数组的序列号。

所以,这道题,其实就是查找两段增序数组合成的数组中的数字,而且这两段数组没有重复的数字。


二分查找的变异


n[m] < target => n[h] < target => n[m] <= n[h] (target在左边) => h = m-1
n[m] > n[h] (target在右边) => l = m+1
n[h] > target (target在右边) => l = m+1
n[h] == target => 返回 h

n[m] > target => n[l] < target (target在左边) => h = m-1
n[l] > target => n[m] >= n[l] (target在右边) => l = m+1
n[m] < n[l] (target在左边) => h = m-1
n[l] == target => 返回 l

n[m] == target => 返回 m


class Solution {
public:
    int search(vector<int>& nums, int target) {
        int l = 0, h = nums.size()-1;
        int m = (l+h)/2;

        while(l <= h)   {
            if(nums[m] > target)    {
                if(nums[l] < target)    h = m-1;    
                else if(nums[l] > target)
                    if(nums[m] >= nums[l])  l = m+1;
                    else    h = m-1;
                else    return l;
            }
            else if(nums[m] < target)   {
                if(nums[h] < target)
                    if(nums[m] <= nums[h])  h = m-1;
                    else    l = m+1;
                else if(nums[h] > target) l = m+1;
                else    return h;
            }
            else
                return m;
            m = (l+h)/2;
        }

        return -1;
    }
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值