首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

在旋转数组中搜索

是一种在一个经过旋转的有序数组中查找特定元素的算法。在旋转数组中,数组中的一部分元素被移动到数组的末尾,形成一个断开点,导致原本的有序数组变得部分有序。例如,数组 [4,5,6,7,0,1,2] 经过旋转后变成 [0,1,2,4,5,6,7]。

要在旋转数组中搜索一个特定元素,可以使用二分查找算法的变种来解决。具体步骤如下:

  1. 初始化左指针 left 指向数组的起始位置,右指针 right 指向数组的末尾位置。
  2. 在每一次迭代中,计算中间元素的索引 mid,并比较该元素与目标元素的大小。
  3. 如果中间元素等于目标元素,则返回该元素的索引。
  4. 如果中间元素大于等于左指针指向的元素,则说明左半部分是有序的。
    • 如果目标元素位于左半部分的有序区间内,则将右指针 right 更新为 mid - 1,并继续在左半部分进行二分查找。
    • 否则,将左指针 left 更新为 mid + 1,并在右半部分进行二分查找。
  • 如果中间元素小于等于右指针指向的元素,则说明右半部分是有序的。
    • 如果目标元素位于右半部分的有序区间内,则将左指针 left 更新为 mid + 1,并继续在右半部分进行二分查找。
    • 否则,将右指针 right 更新为 mid - 1,并在左半部分进行二分查找。
  • 如果没有找到目标元素,返回 -1 表示未找到。

旋转数组中搜索的算法时间复杂度为 O(log n),其中 n 是数组的长度。该算法可以快速有效地查找旋转数组中的特定元素。

以下是推荐的腾讯云相关产品和产品介绍链接地址:

  • 云服务器(ECS):https://cloud.tencent.com/product/cvm
  • 云数据库 MySQL 版:https://cloud.tencent.com/product/cdb_mysql
  • 云存储 CFS:https://cloud.tencent.com/product/cfs
  • 人工智能平台:https://cloud.tencent.com/product/ai
  • 物联网平台(IoT Hub):https://cloud.tencent.com/product/iothub
  • 视频处理(云点播):https://cloud.tencent.com/product/vod
  • 音视频处理(即时通信IM):https://cloud.tencent.com/product/im
  • 区块链服务(区块链 BaaS):https://cloud.tencent.com/product/baas
  • 元宇宙解决方案:https://cloud.tencent.com/solution/metaverse

请注意,以上推荐的产品仅作为参考,您可以根据实际需求选择适合的产品。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

必会算法:旋转有序的数组搜索

大家好,我是戴先生 今天给大家介绍一下如何利用玄学二分法找出目标值元素 想直奔主题的可直接看思路2 ##题目 整数数组 nums 按升序排列,数组的值互不相同 传递给函数之前,nums...预先未知的某个下标 k(0 <= k < nums.length)上进行了 旋转,使数组变为 [nums[k], nums[k+1], ..., nums[n-1], nums[0], nums[1...: 将数组第一个元素挪到最后的操作,称之为一次旋转 现将nums进行了若干次旋转 给你 旋转后 的数组 nums 和一个整数 target 如果 nums 存在这个目标值 target 则返回它的下标...这样思路就非常清晰了 二分查找的时候可以很容易判断出 当前的中位数是第一段还是第二段 最终问题会简化为一个增序数据的普通二分查找 我们用数组[1,2,3,4,5,6,7,8,9]举例说明 target...所以可以判断出 此时mid=4是处在第一段的 而且目标值mid=4的前边 此时,查找就简化为了增序数据的查找了 以此类推还有其他四种情况: mid值第一段,且目标值的前边 mid值第二段

2.8K20
  • 搜索旋转排序数组(leetcode 33)

    1.问题描述 整数数组按升序排列,数组的值互不相同 。 假设数组预先未知的某个点上进行了旋转。 如数组 [0,1,2,4,5,6,7] 可能变为 [4,5,6,7,0,1,2]。...搜索一个给定的目标值,如果数组存在目标值,则返回它的索引,否则返回 -1 。 算法时间复杂度必须是 O(logn) 级别。...这是因为该数组预先未知的某个点上进行了旋转,已不再是一个完全的升序数组。 首先理解以下这个旋转特性。...如果 [l, mid-1] 是有序数组,且 target 大小满足 [nums[l],nums[mid]),则将搜索范围缩小至 [l, mid-1],否则在 [mid+1, r] 寻找。...如果 [mid, r] 是有序数组,且 target 大小满足 (nums[mid],nums[r]],则将搜索范围缩小至 [mid+1, r],否则在 [l, mid-1] 寻找。

    16720

    【奇技淫巧】-- 搜索旋转数组

    假设按照升序排序的数组预先未知的某个点上进行了旋转。 ( 例如,数组 [0,1,2,4,5,6,7] 可能变为 [4,5,6,7,0,1,2] )。...搜索一个给定的目标值,如果数组存在这个目标值,则返回它的索引,否则返回 -1 。 你可以假设数组不存在重复的元素。 你的算法时间复杂度必须是 O(log n) 级别。...用题目中给的例子来分析,对于数组[0 1 2 4 5 6 7] 共有下列七种旋转方法: ?...二分搜索法的关键在于获得了中间数后,判断下面要搜索左半段还是右半段,我们观察上面红色加粗的数字都是升序的,由此我们可以观察出规律,如果中间的数小于最右边的数,则右半段是有序的,若中间数大于最右边数,则左半段是有序的...,我们只要在有序的半段里用首尾两个数组来判断目标值是否在这一区域内,这样就可以确定保留哪半边了,代码如下 int search(vector& nums, int target) {

    27830

    搜索旋转排序数组

    题目: 假设按照升序排序的数组预先未知的某个点上进行了旋转。 ( 例如,数组 [0,1,2,4,5,6,7] 可能变为 [4,5,6,7,0,1,2] )。...搜索一个给定的目标值,如果数组存在这个目标值,则返回它的索引,否则返回 -1 。 你可以假设数组不存在重复的元素。 你的算法时间复杂度必须是 O(log n) 级别。...「二分」不是单纯指从有序数组快速找某个数,这只是「二分」的一个应用。 「二分」的本质是两段性,并非单调性。只要一段满足某个性质,另外一段不满足某个性质,就可以用「二分」。...两段有序值的分布 思路: 二分法: 如上所示我画了个图,其实每次我们判断中值的时候都会拿到两个跟别是有序的片段,且左端的值是比右端的大的 我们要先根据 nums[mid] 与 nums[l] 的关系判断...mid 是左段还是右段,接下来再判断 target 是 mid 的左边还是右边,从而来调整左右边界 l 和 r。

    21910

    搜索旋转排序数组

    题目描述 假设按照升序排序的数组预先未知的某个点上进行了旋转。 ( 例如,数组 [0,1,2,4,5,6,7] 可能变为 [4,5,6,7,0,1,2] )。...搜索一个给定的目标值,如果数组存在这个目标值,则返回它的索引,否则返回 -1 。 你可以假设数组不存在重复的元素。 你的算法时间复杂度必须是 O(log n) 级别。...这道题目不是直接的有序数组,不然就是easy了。 首先要知道,我们随便选择一个点,将数组分为前后两部分,其中一部分一定是有序的。...比如mid右侧有序部分,即[mid, end] 那么我们只需要判断 target >= mid && target <= end 就能知道target右侧有序部分,我们就 可以舍弃左边部分了(start...start, mid] 之间 start = mid + 1; } } else { // [mid, end]有序 // target

    40720

    LeetCode-33-搜索旋转排序数组

    # LeetCode-33-搜索旋转排序数组 假设按照升序排序的数组预先未知的某个点上进行了旋转。 ( 例如,数组 [0,1,2,4,5,6,7] 可能变为 [4,5,6,7,0,1,2] )。...搜索一个给定的目标值,如果数组存在这个目标值,则返回它的索引,否则返回 -1 。 你可以假设数组不存在重复的元素。 你的算法时间复杂度必须是 O(log n) 级别。...根据旋转的规则,旋转点可能出现在数组中间,也可能出现旋转数组不变的情况 假设旋转点出现在数组中间: 数组分成2部分有序,可以通过判断target和low、high之间的大小来确定target可能在哪一半数组...其次,定义旋转边界,左半边数组升序排列,右半边数组从右向左降序排列 如果从low开始向右遍历,则满足nums[i]-num[i-1]>0,当小于0时,则为旋转边界。...如果到达边界都没有找到,说明查找的数不在数组,此时返回-1,如果查找过程中找到target则返回数组下标。 从high开始向左遍历情况类似。

    22410

    T11-搜索旋转排序数组

    这是木又陪伴你的第18天 今天分享leetcode第11篇文章,也是leetcode第33题—Search in Rotated Sorted Array(搜索旋转排序数组),地址是:https://leetcode.com...target = 0 Output: 4 Example 2: Input: nums = [4,5,6,7,0,1,2], target = 3 Output: -1 【中文题目】 假设按照升序排序的数组预先未知的某个点上进行了旋转...( 例如,数组 [0,1,2,4,5,6,7] 可能变为 [4,5,6,7,0,1,2] )。 搜索一个给定的目标值,如果数组存在这个目标值,则返回它的索引,否则返回 -1 。...如果你看过上一篇文章(寻找旋转排序数组的最小值),自然可以想到一种方法:首先寻找最小值,然后由于最小值左右两个区间都是排序数组,因此使用二分查找即可。 有没有更加简单的方法?...相关文章: T9-寻找旋转排序数组的最小值 T10-寻找旋转排序数组的最小值II 给我好看

    34620

    搜索旋转排序数组

    题目 整数数组 nums 按升序排列,数组的值 互不相同 。...传递给函数之前,nums 预先未知的某个下标 k(0 <= k < nums.length)上进行了 旋转,使数组变为 [nums[k], nums[k+1], …, nums[n-1], nums...例如, [0,1,2,4,5,6,7] 在下标 3 处经旋转后可能变为 [4,5,6,7,0,1,2] 。...给你 旋转后 的数组 nums 和一个整数 target ,如果 nums 存在这个目标值 target ,则返回它的下标,否则返回 -1 。...分析 我们先读下题目,等你读完前半部分你会觉得,非常easy,不就是让我一个数组里找一个目标值嘛,这不是非常轻松 然后你看到了O(logn),ok,木问题,二分查找,开找,你信心慢慢的开始写代码,直到你发现了这个数组好像不是有序的

    13010

    LeetCode-33 搜索旋转排序数组

    搜索旋转排序数组 > 难度:中等 > 分类:数组 > 解决方案:二分查找 题目描述 假设按照升序排序的数组预先未知的某个点上进行了旋转。...( 例如,数组 [0,1,2,4,5,6,7]可能变为 [4,5,6,7,0,1,2] )。 搜索一个给定的目标值,如果数组存在这个目标值,则返回它的索引,否则返回 -1。...你可以假设数组不存在重复的元素。 你的算法时间复杂度必须是 O(log n)级别。...这道题与传统的二分查找不同的是,给定的数组是一个旋转排序数组。我们先分析一下什么是旋转排序数组,如下图所示 ? 我们称红色部分的7和绿色部分的0为旋转区域,即排序数组分割区域。...参考链接 搜索旋转排序数组:https://leetcode-cn.com/problems/search-in-rotated-sorted-array/

    1.2K30

    LeetCode题目33:搜索旋转排序数组

    搜索一个给定的目标值,如果数组存在这个目标值,则返回它的索引,否则返回-1 。 你可以假设数组不存在重复的元素。 你的算法时间复杂度必须是 O(log n) 级别。...它提示我们,即使数组顺序经过“旋转”这种轻微的“破坏”之后,依然可以使用二分查找。 不是对排序的破坏都可以应用二分查找,但旋转可以。...根据题目描述,旋转是指:一个排好序的数组,截取从头部开始的子数组,将其安插到末尾。用这种方式处理升序数组后,一定会变成两个分段后的升序数组,如下图所示。 ?...target要么保序子数组,要么不保序数组。我们可以通过target与保序数组的关系,来界定搜索范围。...如果target保序数组,那么搜索范围将限定在保序数组; 如果target不在保序数组,那么搜索范围将限定在非保序数组。 ?

    47610

    leetcode-33-搜索旋转排序数组

    题目描述: 假设按照升序排序的数组预先未知的某个点上进行了旋转。 ( 例如,数组 [0,1,2,4,5,6,7] 可能变为 [4,5,6,7,0,1,2] )。...搜索一个给定的目标值,如果数组存在这个目标值,则返回它的索引,否则返回 -1 。 你可以假设数组不存在重复的元素。 你的算法时间复杂度必须是 O(log n) 级别。...,只不过现在这个升序数组某个节点上旋转了。...比如[4,5,6,7,0,1,2],原本就是一个升序数组,现在旋转了,要求用O(logn)的时间复杂度找到targetvector的索引。...,那么返回-1 } 通过while循环找到旋转节点的索引的代码,我们先明确我们要找的旋转节点是“既小于左边的数值,又小于右边的数值”。

    38230
    领券