Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >折半查找部分有序

折半查找部分有序

作者头像
早起的鸟儿有虫吃
发布于 2018-04-13 02:42:21
发布于 2018-04-13 02:42:21
68500
代码可运行
举报
文章被收录于专栏:算法之美算法之美
运行总次数:0
代码可运行

部分有序 本周qq群有人咨询

Search in Rotated Sorted Array 来源: https://leetcode.com/problems/search-in-rotated-sorted-array/ 难度:Difficulty: Hard

题目

Suppose a sorted array is rotated(旋转的) at some pivot unknown to you beforehand(提前的) eg: 0 1 2 3 4 5 6 7 旋转3个might become 4 5 6 7 0 1 2 3. You are given a target value to search. If found in the array return its index, otherwise return -1. You may assume no duplicate exists in the array.

分析:

观察:

  • 举例就用0-9来打比方很容易观察规律
  • 7为旋转点两边都是升序 【4 5 6】 【0 1 2 3 】这个问题来了 不清楚应该去那边去寻找方向了 例如寻找3 可能在left 也有可能在right 从7 来看 一个升序 一个降序 都可能 …….. ……. 从这个思路无法判断,你明确表示出来 判断不了,你感觉没问题就是分析不出来呀 然后果断在换个思路 这个我一般不具备 不能在这里死磕 不然陷入了题目给造成的陷阱去了

Q1 有序数组折半是中间位置和查找元素 现在中间位置可以判断出来 查找元素元素方向无法判断如果不匹配是 去left 还是right寻找

我感觉还是判断趋势 假如array[begin end] case 1 0 1 2 3 4 5 6 7 特点:7>0 array[end] > array[begin]升序

case 2 4 5 6 7 0 1 2 3 特点:array[end] < array[begin] 旋转点在中间

是升序 还是降序还是 还是混合都有 我用的根据相 邻2个元素 6 7 0 判断出来了还是解决无法判断呢

Q2一个数组 确定中间位置去判断(相邻元素) 假如是7 left是 升序[4 5 6 7] 你如何判断查找元素3位置 回到问题Q1了 你忘记是有序了 一眼看出3不再这里面呀 3<4<7 回到问题Q1了 A2:为什么那相邻元素呢 为什么不用 array[end],array[begin] 一个数组假如有拐点 无法判断就不去判断了,继续拆分

如果一个数组不满足判断条件 继续拆分 满足到符合条件为止

步骤

step 1 选择中间位置 此时 数组将一份为二 A,B 一边是完全有序 部分A 一是包含旋转点部分B step 2 完全有序 部分A 查找非常简单 判断查找数据是否在有序数组A中 如果在A中对范围A进行查找 step 3 如果没有A中 对B重复步骤 1 2

coding

class Solution { public: int search(vector& nums, int target) { int begin=0;//开始位置 int end=nums.size()-1;//结束位置

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
1.   //如果元素个数小于<<2个不适合2.   if(0 ==end )3.   {4.       return target ==nums[0]?0:-1;5.   }6.   if(1 == end )7.   {8.       if(target ==nums[0] ) {return 0;}9.       if(target ==nums[1]) {return 1;}10.       return -1;11.   }12.   while(begin<=end)13.   {    14.        int mid=(end+begin)/2;15.       //find 16.       if( target == nums[mid])17.       {18.           return mid;19.       }20.21.       // 完全有序A |mdi|包含拐点的有序B22.       if(nums[begin]<=nums[mid] )23.       {    //查找数据在完全有序数组A中 只要对数组A进行折半查找24.           if(nums[begin]<=target && target <nums[mid] )25.           {26.               end=mid-1;27.           }else //包含拐点的有序B中28.           {29.               begin=mid+1;30.           }31.       }else32.       { // 包含拐点的有序B|mdi|完全有序A33.34.            if(nums[mid]<target && target <=nums[end] )35.           {36.               begin=mid+1;37.           }else //包含拐点的有序B中38.           {39.              end=mid-1;40.           }41.       }42.   }43.44.   return -1;//not find 45.}

};

验证:

代码错误 <= 写成 << 不是比较运算符了 if(nums[begin]<<target && target<nums[mid] ) 改为 nums[begin]<=target

[5,1] 最后两个元素分隔时候 if(nums[begin]<nums[mid] ) 改为 if(nums[begin]<=nums[mid] )

难点:

当中间元素和查找元素不相等时候 如何确定查找元素范围 ->通过通过比较中间元素 和开始和结束位置 确定完全有序范围 -> 从而推断查找元素范围

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2016-05-22,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Offer多多 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Leetcode 33 Search in Rotated Sorted Array 二分查找变式
Suppose a sorted array is rotated at some pivot unknown to you beforehand. (i.e., 0 1 2 4 5 6 7 might become 4 5 6 7 0 1 2). You are given a target value to search. If found in the array return its index, otherwise return -1. You may assume no duplica
triplebee
2018/01/12
4970
搜索旋转排序数组(leetcode33)
在传递给函数之前,nums 在预先未知的某个下标 k(0 <= k < nums.length)上进行了 旋转,使数组变为 [nums[k], nums[k+1], ..., nums[n-1], nums[0], nums[1], ..., nums[k-1]](下标 从 0 开始 计数)。例如, [0,1,2,4,5,6,7] 在下标 3 处经旋转后可能变为 [4,5,6,7,0,1,2] 。
Vincent-yuan
2022/05/06
2650
搜索旋转排序数组(leetcode33)
每天一道leetcode-81
目前准备每天刷一道题leetcode的题目,以此来激励那些零基础入门的人,千万不要被什么科班和非科班的说法吓倒了,计算机这个行业只要你肯努力,没有什么逾越不了的鸿沟。
乔戈里
2019/09/17
3570
每天一道leetcode-81
33. Search in Rotated Sorted Array
https://leetcode.com/problems/search-in-rotated-sorted-array/
翎野君
2023/05/12
1680
经典排序之折半查找
了解一个知识,必须先要从其含义开始。 折半查找,又称二分法查找。意在一个有序的序列当中,从最大值与最小值开始,从两个值的中间值为分渠道,再次判断是否位于区间内,重复获取中间值,直至找到需要查找的值。 折半查找,适用于数据量很大的情况。 具体是什么意思呢,一个例子搞定:数字炸弹游戏
腿子代码了
2023/10/08
4440
经典排序之折半查找
二分查找的通用模板
二分查找适用于对于有序数组的精确查找,例如从一个有序数组中找到指定元素的索引,可将时间复杂度从普通枚举的 O(n) 降至 O(log n) ,前提是数组必须是有序的,否则是没有办法使用二分查找的。二分查找的思想虽然简单,不过在实现过程中会有很多细节问题需要注意,例如判断循环是用left < right还是用left <= right,right是取最右的元素还是取数组的边界。本文想通过七个例题,约定一种规则或是模板,从此让写二分查找不再出现模棱两可的局面。
兜兜转转
2023/03/08
9380
LeetCode<二分搜索> 33 & 81 Search in Rotated Sorted Array I&II
Suppose an array sorted in ascending order is rotated at some pivot unknown to you beforehand.
大学里的混子
2018/10/30
6710
二分问题-LeetCode 33、34(上下边界,二分查找)
( 例如,数组 [0,1,2,4,5,6,7] 可能变为 [4,5,6,7,0,1,2] )。
算法工程师之路
2019/09/19
9700
LeetCode <二分搜索>34.Find First and Last Position of Element in Sorted Array
Given an array of integers nums sorted in ascending order, find the starting and ending position of a given target value.
大学里的混子
2018/10/30
1.2K0
【leetcode刷题】T12-搜索旋转排序数组II
今天分享leetcode第12篇文章,也是leetcode第81题—搜索旋转排序数组II(Search in Rotated Sorted Array II),地址是:https://leetcode.com/problems/search-in-rotated-sorted-array-ii/
木又AI帮
2019/07/18
5080
【leetcode刷题】T12-搜索旋转排序数组II
菜鸟刷题Day5
给你一个数组 nums 。数组「动态和」的计算公式为:runningSum[i] = sum(nums[0]…nums[i]) 。
始终学不会
2023/03/28
3300
菜鸟刷题Day5
LeetCode题目33:搜索旋转排序数组
( 例如,数组 [0,1,2,4,5,6,7] 可能变为 [4,5,6,7,0,1,2] )。
二环宇少
2020/08/13
4970
LeetCode题目33:搜索旋转排序数组
【每日一题】33. Search in Rotated Sorted Array
Suppose an array sorted in ascending order is rotated at some pivot unknown to you beforehand.
公众号-不为谁写的歌
2020/08/11
3670
【每日一题】33. Search in Rotated Sorted Array
二分查找
已知一个排序数组A,如A= [-1,2,5,20,90,100,207,800] 另外一个乱序数组B,如B =[50,90,3,-1,207,80] 求B中的任意某个元素,是否在A中出现,结果存储在数组C中,出现用1代表,未出现用0代表,如,C = [0,1,0,1,1,0]。
小飞侠xp
2018/08/29
2150
穿了好几个马甲,差点没认出来是二分查找
今天给大家带来的是二分查找及其变种的总结,大家一定要看到最后呀,非常非常用心的一篇文章,废话不多说,让导演帮我们把镜头切到袁记菜馆吧!
公众号袁厨的算法小屋
2020/12/22
5880
穿了好几个马甲,差点没认出来是二分查找
33. 搜索旋转排序数组
( 例如,数组 [0,1,2,4,5,6,7] 可能变为 [4,5,6,7,0,1,2] )。
lucifer210
2019/09/29
4200
33. 搜索旋转排序数组
[算法总结] 二分查找
二分查找法作为一种常见的查找方法,将原本是线性时间提升到了对数时间范围,大大缩短了搜索时间,但它有一个前提,就是必须在有序数据中进行查找。
尾尾部落
2018/09/04
7840
LeetCode 33. 搜索旋转排序数组(二分查找)
( 例如,数组 [0,1,2,4,5,6,7] 可能变为 [4,5,6,7,0,1,2] )。
Michael阿明
2020/07/13
3200
LeetCode 33. 搜索旋转排序数组(二分查找)
LeetCode-算法-二分查找-第15天
给定一个按照升序排列的整数数组 nums,和一个目标值 target。找出给定目标值在数组中的开始位置和结束位置。 如果数组中不存在目标值 target,返回 [-1, -1]。
布衣者
2021/09/07
2540
[Leetcode][python]搜索旋转排序数组/搜索旋转排序数组 II
把一个严格升序的数组进行旋转,如[0,1,2,3,4,5]旋转3位成为[3,4,5,0,1,2]。在这样的数组中找到目标数字。如果存在返回下标,不存在返回-1。 输入: nums = [4, 5, 6, 7, 0, 1, 2], target = 6 输出: 2 输入: nums = [4, 5, 6, 7, 0, 1, 2], target = 3 输出: -1
蛮三刀酱
2019/03/26
6350
推荐阅读
相关推荐
Leetcode 33 Search in Rotated Sorted Array 二分查找变式
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验