Leetcode 33:搜索旋转排序数组

一句话总结解题思路:带有特殊技巧的“二分查找”

 

  • 题意理解:

所谓旋转数组,通俗来讲就是以数组中某下标k为界,将从k到数组尾的所有元素全部提前。现在我们的目标是找到 target 在数组中的位置,时间复杂度相对较低的算法当然还是二分查找啦。可是,我们以往的二分查找都是建立在数组有序排列的基础上,显然本题给出的数组 nums 不满足条件。但由于部分元素间保持了有序的状态,所以,利用好它们之间的升序关系是解决本题的关键。

  • 代码实现:

               

class Solution {
public:
    int search(vector<int>& nums, int target) {
        int i=0;
        int j=nums.size()-1;
        int res=-1;
        while(i<=j){
            int mid=i+(j-i)/2;
            if(nums[mid]==target){
                res=mid;
                break;
            }
            if(nums[mid]>nums[j]){
                if(target>=nums[i]&&target<nums[mid])
                    j=mid-1;
                else
                    i=mid+1;
            }
            else{
                if(target<=nums[j]&&target>nums[mid])
                    i=mid+1;
                else
                    j=mid-1;
            }
        }
        return res;
    }
};
  • 代码解析:

               代码中最难理解的部分就是while循环里的内容。nums[mid]==target 就不用多说了,找到满足要求的index,直接 break ;当 nums[mid]>nums[j] 说明此时 mid右边元素乱序,左边升序。此时再将 target 与左边部分的上界下界进行比较,即 nums[i] 与 nums[mid] ,如果在此区间内,我们就可以进一步锁定查找范围,置 j=mid-1;同理,mid左边乱序,右边升序亦是如此。

  • 一些tips:

               ①哈哈哈其实这道题用for循环效果还挺好的,不过做题重在锻炼思维嘛,没错,我就要与自己为难😕。

               ②二分查找其实不是很难,while循环罢辽~,就是有的时候会变变花样,结合思维上的技巧来出题。

哇哇哇第三篇啦,大家都要加油嗷💪

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值