栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

Leetcode 33:搜索旋转排序数组

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Leetcode 33:搜索旋转排序数组

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

 

  • 题意理解:

所谓旋转数组,通俗来讲就是以数组中某下标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循环罢辽~,就是有的时候会变变花样,结合思维上的技巧来出题。

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

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/960102.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号