
81. Search in Rotated Sorted Array II
问题分析:数组被旋转后,可能分成两部分,左边和右边。我们需要找到目标值在这两部分中的任何一个位置。 关键思路:通过比较中间元素和右边元素的值,确定目标值可能在左边或右边部分。 详细步骤: 处理重复元素:在判断条件时,考虑到重复元素,确保正确缩小查找范围。
发布日期:2021-05-04 20:03:50
浏览次数:19
分类:精选文章
本文共 1582 字,大约阅读时间需要 5 分钟。
要解决这个问题,我们需要找到一个目标值在一个被旋转的已排序数组中。由于数组被旋转,传统的二分查找方法可能不适用。我们可以通过比较中间元素和右边元素的值来调整查找范围。
方法思路
- 初始化左指针和右指针。
- 进入循环,计算中间元素。
- 比较中间元素和右边元素的值,决定下一步查找方向。
- 如果中间元素等于目标值,返回true。
- 根据比较结果调整左或右指针的范围。
解决代码
public boolean search(vector nums, int target) { if (nums.empty()) { return false; } int left = 0; int right = nums.size() - 1; while (left < right) { int mid = left + (right - left) / 2; if (nums[mid] == target) { return true; } if (nums[mid] > nums[right]) { // 左边可能有序,右边可能有序 if (target < nums[mid]) { right = mid - 1; } else { left = mid + 1; } } else if (nums[mid] < nums[right]) { // 右边可能有序 if (target > nums[mid]) { left = mid + 1; } else { right = mid - 1; } } else { // nums[mid] == nums[right] // 继续检查右边的部分 if (nums[right] == target) { return true; } else { right = mid - 1; } } } return nums[left] == target || nums[right] == target;}
代码解释
- 初始化:检查数组为空,返回false。初始化左指针为0,右指针为数组末尾。
- 循环处理:在数组有序时,计算中间元素。比较中间元素和右边元素的值,决定左或右指针的调整方向。
- 条件判断:
- 如果中间元素等于目标值,返回true。
- 如果中间元素大于右边元素,调整指针以缩小查找范围。
- 如果中间元素小于右边元素,调整指针以缩小查找范围。
- 如果中间元素等于右边元素,继续检查右边部分。
- 终止条件:当指针相交时,检查边界元素是否为目标值,返回结果。
这种方法确保了在旋转数组中高效地查找目标值,时间复杂度为O(log n)。
发表评论
最新留言
关注你微信了!
[***.104.42.241]2025年03月27日 17时01分18秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
Two Day今日程序学习记录->关于指针的一点问题以及16进制转10进制
2019-03-04
《Java---------java环境搭建》
2019-03-04
【SSL】1203书的复制(normal)
2019-03-04
【SSL】1072砝码称重
2019-03-04
【SSL】2294打包
2019-03-04
标程_高精度运算
2019-03-04
【SSL】1033&【洛谷】P1040加分二叉树
2019-03-04
js数据结构--队列--常见操作
2019-03-04
JS数据结构--单向链表--常见操作
2019-03-04
【SSL】1606&【洛谷】P2014选课
2019-03-04
JS数据结构--双向链表--常见操作
2019-03-04
【SSL】1230&【洛谷】P2016战略游戏
2019-03-04
洛谷P1377树的序
2019-03-04
高阶函数-语法糖-lambda(三分钟读懂)
2019-03-04
vue的computed单向绑定(如淘宝的购物车中使用)
2019-03-04
vue双向绑定
2019-03-04
vue写自定义指令(全局或者组件内部)
2019-03-04
vue监听用户点击区域
2019-03-04
python functools模块方法
2019-03-04
python os库
2019-03-04