Leetcode 33:搜索旋转排序数组

Leetcode 33:搜索旋转排序数组,第1张

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

 

  • 题意理解:

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

  • 代码实现:

               

class Solution {
public:
    int search(vector& 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]&&targetnums[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循环罢辽~,就是有的时候会变变花样,结合思维上的技巧来出题。

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

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1353430.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-14
下一篇 2022-06-14

发表评论

登录后才能评论

评论列表(0条)

保存