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

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

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

2.8K20
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    搜索旋转排序数组

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

    41420

    搜索旋转排序数组(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] 中寻找。

    17320

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

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

    28330

    搜索旋转排序数组

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

    22210

    每天一道leetcode-74 二维数组搜索n

    题目 leetcode-74 二维数组搜索一个数 分类(tag):二分查找这一类 英文链接: https://leetcode.com/problems/search-a-2d-matrix/ 中文链接...right=12-1=11,也就是代码6-7行所示; mid是二者去中间值,没毛病,mid=5第10行所示; 难点就在于matrix[mid/n][mid%n]的理解,就是对于一个下标如何确定它在二维数组中的位置...,对于二维数组中,1来说,1是第0个数,第0/4行,3是第一个数,第0/4行,5是第2个数,第0/4行,7是第3个数,第0/4行,10是第4个数,第4/4行,11是5个数,第5/4行........观察规律可知...所以mid的下标对应的二维数组中的数就是matrix[mid/4][mid%4]; 结果展示 ? 5ms的是二分查找的结果,比《剑指offer》还快了2ms。

    86650

    搜索旋转排序数组

    题目 整数数组 nums 按升序排列,数组中的值 互不相同 。...传递给函数之前,nums 预先未知的某个下标 k(0 <= k < nums.length)上进行了 旋转,使数组变为 [nums[k], nums[k+1], …, nums[n-1], nums...分析 我们先读下题目,等你读完前半部分你会觉得,非常easy,不就是让我一个数组里找一个目标值嘛,这不是非常轻松 然后你看到了O(logn),ok,木问题,二分查找,开找,你信心慢慢的开始写代码,直到你发现了这个数组好像不是有序的...也就是说相对于有序数组的二分查找,我们多了一步判断本不应检索的那一边是否有序这个步骤。 那么怎么判断是否有序呢?...这时候左边的端点值肯定是大于mid指向的值的,例如我们现在设置mid指向0,此时4大于0,说明左边是无序的,也需要查找;而mid右边是无序的时候,这时候右端点值肯定小于mid指向的值,例如现在mid指向7所的位置

    13610

    LeetCode-33 搜索旋转排序数组

    搜索旋转排序数组 > 难度:中等 > 分类:数组 > 解决方案:二分查找 题目描述 假设按照升序排序的数组预先未知的某个点上进行了旋转。...( 例如,数组 [0,1,2,4,5,6,7]可能变为 [4,5,6,7,0,1,2] )。 搜索一个给定的目标值,如果数组中存在这个目标值,则返回它的索引,否则返回 -1。...这道题与传统的二分查找不同的是,给定的数组是一个旋转排序数组。我们先分析一下什么是旋转排序数组,如下图所示 ? 我们称红色部分的7和绿色部分的0为旋转区域,即排序数组分割区域。...Github地址 LeetCode-33 搜索旋转排序数组:https://github.com/JacobLei/leetcode/blob/master/src/main/java/A33_SearchinRotatedSortedArray.java...参考链接 搜索旋转排序数组:https://leetcode-cn.com/problems/search-in-rotated-sorted-array/

    1.2K30

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

    原题描述 + 假设按照升序排序的数组预先未知的某个点上进行了旋转。 ( 例如,数组 [0,1,2,4,5,6,7] 可能变为 [4,5,6,7,0,1,2] )。...搜索一个给定的目标值,如果数组中存在这个目标值,则返回它的索引,否则返回-1 。 你可以假设数组中不存在重复的元素。 你的算法时间复杂度必须是 O(log n) 级别。...根据题目描述,旋转是指:一个排好序的数组中,截取从头部开始的子数组,将其安插到末尾。用这种方式处理升序数组后,一定会变成两个分段后的升序数组,如下图所示。 ?...target要么保序子数组中,要么不保序数组中。我们可以通过target与保序数组的关系,来界定搜索范围。...如果target保序数组中,那么搜索范围将限定在保序数组; 如果target不在保序数组中,那么搜索范围将限定在非保序数组。 ?

    48110

    封装数组之包含、搜索和删除元素

    前言:在上一小节中我们已经会了如何获取和如何修改数组中的元素,本小节中我们将继续学习如何判断某个元素是否在数组中存在、查询出某个元素在数组中的位置、以及删除数组中元素等方法的编写。  ...if (data[i] == e) return true; } return false; } 有时候查询过程中...,我们不仅想知道是否包含该指定元素,还想是该元素所在的位置,则我们可以编写一个查找数组中元素e所在的索引的方法。...,内部无须在返回, (2)针对通过索引方式删除的元素需要返回被删除,这是由于用户并不知道自己删除的元素值是什么,我们把被删除的值返回给用户,以便于用户需要使用时取用。  ...] 在数组头部位置插入元素e: Array: size = 12 , capacity = 20 [-10,0,200,1,2,3,4,5,6,7,8,9] 根据数组索引查找数组元素: 9 修改数组索引位置上元素值

    78520
    领券