首页
学习
活动
专区
工具
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 旋转,使数组变为 [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] 中寻找。

    18220

    搜索旋转排序数组

    题目描述 假设按照升序排序的数组在预先未知的某个点上进行了旋转。 ( 例如,数组 [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 在右侧有序部分,我们就 可以舍弃左边部分了(start

    41520

    搜索旋转排序数组

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

    22510

    在排序数组中查找数字

    在排序数组中查找数字 题目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开始向左遍历情况类似。...,虽然划分了数组,但比较过程仍然只是线性遍历 我们可以进一步利用二分查找来进行搜索 如果中间的数小于最右边的数,则右半段是有序的 如果中间的数大于最右边的数,则左半段是有序的 我们只需要在有序的半段里用首尾两个数来判断目标值是否在这个区域中

    23810

    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 给我好看

    36020

    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

    LeetCode49|搜索旋转排序数组

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

    29120

    搜索旋转排序数组

    搜索旋转排序数组) https://leetcode-cn.com/problems/search-in-rotated-sorted-array/ 题目描述 整数数组 nums 按升序排列,数组中的值...在传递给函数之前,nums 在预先未知的某个下标 k(0 旋转,使数组变为 [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) 的解决方案吗?

    28630

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

    原题描述 + 假设按照升序排序的数组在预先未知的某个点上进行了旋转。 ( 例如,数组 [0,1,2,4,5,6,7] 可能变为 [4,5,6,7,0,1,2] )。...它提示我们,即使数组顺序在经过“旋转”这种轻微的“破坏”之后,依然可以使用二分查找。 不是对排序的破坏都可以应用二分查找,但旋转可以。...根据题目描述,旋转是指:在一个排好序的数组中,截取从头部开始的子数组,将其安插到末尾。用这种方式处理升序数组后,一定会变成两个分段后的升序数组,如下图所示。 ?...target要么在保序子数组中,要么在不保序数组中。我们可以通过target与保序数组的关系,来界定搜索范围。...如果target在保序数组中,那么搜索范围将限定在保序数组; 如果target不在保序数组中,那么搜索范围将限定在非保序数组。 ?

    48410
    领券