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

在旋转的排序数组中搜索数字

在旋转的排序数组中搜索数字是一个经典的二分查找问题。在这个问题中,给定一个旋转的排序数组和一个目标数字,要求判断目标数字是否在数组中出现,并返回其索引位置。

旋转排序数组是一个升序排列的数组在某个位置上被旋转,例如4,5,6,7,0,1,2。

要解决这个问题,可以使用二分查找算法。具体步骤如下:

  1. 定义左右指针,分别指向数组的起始和结束位置。
  2. 在每次循环中,计算中间位置的索引,并判断中间位置的值和目标数字的大小关系。
  3. 如果中间位置的值等于目标数字,则直接返回中间位置的索引。
  4. 如果中间位置的值小于目标数字,则说明目标数字在右半部分,将左指针移动到中间位置的右侧。
  5. 如果中间位置的值大于目标数字,则说明目标数字在左半部分,将右指针移动到中间位置的左侧。
  6. 重复上述步骤,直到左指针大于右指针或者找到目标数字。

以下是一个Python实现的示例代码:

代码语言:python
代码运行次数:0
复制
def search(nums, target):
    left, right = 0, len(nums) - 1
    while left <= right:
        mid = (left + right) // 2
        if nums[mid] == target:
            return mid
        elif nums[mid]< target:
            left = mid + 1
        else:
            right = mid - 1
    return -1

这个算法的时间复杂度为O(log n),其中n是数组的长度。

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

相关·内容

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

    大家好,我是戴先生 今天给大家介绍一下如何利用玄学二分法找出目标值元素 想直奔主题可直接看思路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) 级别。...这是因为该数组预先未知某个点上进行了旋转,已不再是一个完全升序数组。 首先理解以下这个旋转特性。...这道题中,数组本身不是有序,进行旋转后只保证了数组局部是有序,这还能进行二分查找吗?答案是可以。 将旋转排序数组均分,一定有一部分数组是有序。...如果 [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) 级别。...思路 这是一个我在网上看到前端头条技术终面的一个算法题。 题目要求时间复杂度为logn,因此基本就是二分法了。这道题目不是直接有序数组,不然就是easy了。...首先要知道,我们随便选择一个点,将数组分为前后两部分,其中一部分一定是有序。...比如mid右侧有序部分,即[mid, end] 那么我们只需要判断 target >= mid && target <= end 就能知道target右侧有序部分,我们就 可以舍弃左边部分了(start

    40720

    搜索旋转排序数组

    题目: 假设按照升序排序数组预先未知某个点上进行了旋转。 ( 例如,数组 [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

    排序数组查找数字

    排序数组查找数字 题目1:数字排序数组中出现次数 统计一个数字排序数组中出现次数。例如,输入排序数组{1,2,3,3,3,3,4,5}和数字3,由于3出现了4次,因此输出4....思路: 2分查找数组第一个k: 1. 如果中间数字大于k,那么k只可能出现在前半段 2. 如果中间数字小于k,那么k只可能出现在后半段 3....一个长度为n-1递增排序数组所有数字都是唯一,并且每个数字都在范围0~n-1之内。范围0~n-1内n个数字中有且仅有一个数字不在该数组,请找出这个数字。...思路:因为数组有序,因此数组开始一些数字与它们下标相同。如果不在数组那个数字记为m,那么所有比m小数字下标都与它们值相同。由于m不在数组,m+1下标正好是m。...如果中间元素值与下标不相等,并且前面一个元素下标与值正好相等,则这个下标就是数组缺失数字。 3. 如果中间元素值与下标不相等,并且前面一个元素下标与值也不相等,怎查找左边。

    3.7K20

    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可能在哪一半数组...如果到达边界都没有找到,说明查找数不在数组,此时返回-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

    LeetCode49|搜索旋转排序数组

    1,问题简述 假设按照升序排序数组预先未知某个点上进行了旋转。 ( 例如,数组 [0,1,2,4,5,6,7] 可能变为 [4,5,6,7,0,1,2] )。...搜索一个给定目标值,如果数组存在这个目标值,则返回它索引,否则返回 -1 。 你可以假设数组不存在重复元素。 你算法时间复杂度必须是 O(log n) 级别。...6,总结 键值对集合使用,凑字数来了,曾经我会后悔自己有些事情没有去做,但是随着自己对自己一通分析,觉得自己本身还是有一些优点,后悔有用吗?...就这样一步步问自己,经过读书理解,自己慢慢明白了一个道理,人生走每一步都算数。...很久之前文章就给与了自己这句话,急功近利,欲速则不达,找好自己的人生路,慢慢跑吧,这样自己的人生方向才有了自己独有的特点。

    28420

    搜索旋转排序数组

    搜索旋转排序数组) https://leetcode-cn.com/problems/search-in-rotated-sorted-array/ 题目描述 整数数组 nums 按升序排列,数组值...传递给函数之前,nums 预先未知某个下标 k(0 <= k < nums.length)上进行了 旋转,使数组变为 [nums[k], nums[k+1], ..., nums[n-1], nums...给你 旋转数组 nums 和一个整数 target ,如果 nums 存在这个目标值 target ,则返回它下标,否则返回 -1 。  ...: 输入:nums = [1], target = 0 输出:-1   提示: 1 <= nums.length <= 5000 -10^4 <= nums[i] <= 10^4 nums 每个值都...独一无二 题目数据保证 nums 预先未知某个下标上进行了旋转 -10^4 <= target <= 10^4   进阶:你可以设计一个时间复杂度为 O(log n) 解决方案吗?

    27930

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

    原题描述 + 假设按照升序排序数组预先未知某个点上进行了旋转。 ( 例如,数组 [0,1,2,4,5,6,7] 可能变为 [4,5,6,7,0,1,2] )。...它提示我们,即使数组顺序经过“旋转”这种轻微“破坏”之后,依然可以使用二分查找。 不是对排序破坏都可以应用二分查找,但旋转可以。...根据题目描述,旋转是指:一个排好序数组,截取从头部开始数组,将其安插到末尾。用这种方式处理升序数组后,一定会变成两个分段后升序数组,如下图所示。 ?...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) 级别。...: int search(vector& nums, int target)  说明: 1、这道题给定一个vector和一个target整数,vector里面装着一个升序数组,只不过现在这个升序数组某个节点上旋转了...比如[4,5,6,7,0,1,2],原本就是一个升序数组,现在旋转了,要求用O(logn)时间复杂度找到targetvector索引。...,那么返回-1 } 通过while循环找到旋转节点索引代码,我们先明确我们要找旋转节点是“既小于左边数值,又小于右边数值”。

    38230

    搜索旋转排序数组

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

    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
    领券