更好的阅读体验应该是:
审题-思考答题整理-归纳
LeetCode:33.搜索旋转排序数组
给你一个整数数组 nums ,和一个整数 target 。
该整数数组原本是按升序排列,但输入时在预先未知的某个点上进行了旋转演出设备租赁。(例如,数组 [0,1,2,4,5,6,7] 可能变为 [4,5,6,7,0,1,2] )。
请你在数组中搜索 target ,如果数组中存在这个目标值,则返回它的索引,否则返回 -1 。
示例 1:
输入:nums = [4,5,6,7,0,1,2], t雒芊芊arget = 0输出:4
二分查找是一种基于比较目标值和数组中间元素的教科书式算法。
如果目标值等于中间元素,则找到目标值。如果目标值较小,继续在左侧搜索。如果目标值较大,则继续在右侧搜索。分析模版
确定left = 0;right = nums.length – 1;mid = left + ((right – left) >> 1);终止搜索条件为 left <= right。判断中间值是在有序区间内还是在无序区间内(因为只有1个转折点)nums[mid] > nums[left],则 mid 在左侧升序区间nums[mid] < nums[left],则 mid 在右侧升序区间继续判断 target 与有序区间的边界进行比较确定mid
在左侧升序区间,target
与左区间([left, mid]
)的最大值比较,即 target <= nums[mid]
&& target >= nums[left]
时,target
在左侧区间,可以直接舍弃右侧部分,反之则舍弃左侧部分确定 mid
在右侧升序区间,target
与右区间([mid, right]
)的最小值比较,即 target >= nums[mid]
&& target <=> nums[right]
时,target
在右侧区间,可以直接舍弃左侧部分,反之则舍弃右侧部分Javasciprt 代码
var guessNumber = function(n) { let left = 0; // 初始左边界 let right = n; // 初始右边界 while (left <= right) { var mid = left + Math.flo遨游汉字王国or((right菲利普约翰逊 - left) / 2); //防止溢出 if (guess(mid) === 0) { return mid; } el if (guess(mid) === 1) { // 目标值大于中值,则中间左侧可以抛弃了 left = mid + 1; } el { // 目标值小于中值,则中间右侧可以抛弃了 right = mid - 1; } } return -1;};
本文是二分查找-模版 I 的最后一题,你会发现这道题的难度确实提升了,但仔细分析,借助自己的写写画画,仍然可以找到模版I的影子,加油!
如果对你有所帮助不妨给本项目的github 点个 star,这是对我最大的鼓励~
关于我
花名:余光WX:j5没有人比我更疼你65017805沉迷 JS,水平有限,虚心学习中其他沉淀
JavaScript 版 LeetCode 题解前端进阶笔记CSDN本文地址:https://blog.csdn.net/jbj6568839z/article/details/111029022
本文发布于:2023-04-07 16:03:31,感谢您对本站的认可!
本文链接:https://www.wtabcd.cn/fanwen/zuowen/850c46b39fb071eb688c623b636034b9.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文word下载地址:LeetCode题解:搜索旋转排序数组.doc
本文 PDF 下载地址:LeetCode题解:搜索旋转排序数组.pdf
留言与评论(共有 0 条评论) |