news 2026/5/11 22:55:39

33. 搜索旋转排序数组

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
33. 搜索旋转排序数组

这题本质上还是二分查找,只是数组被“旋转”了。

正常二分里,数组整体有序。
但这里:

[4,5,6,7,0,1,2]

整体不是有序的。

不过有个非常关键的性质:

每次二分后,左右两边一定有一边是有序的。

这就是突破口。


一、核心思路

每次取中点:

mid = (left + right) / 2

然后判断:

nums[left] <= nums[mid]

如果成立:

说明左半边有序

否则:

说明右半边有序

然后看target是否落在有序区间内。


二、举例彻底理解

数组:

[4,5,6,7,0,1,2]

target = 0


第一次

left = 0 -> 4 right = 6 -> 2 mid = 3 -> 7

现在:

4 5 6 7 | 0 1 2

看:

nums[left] <= nums[mid] 4 <= 7

成立。

说明:

左边 [4,5,6,7] 有序

然后判断:

target=0 是否在:

[4,7]

之间。

显然不在。

所以:

去右边找

即:

left = mid + 1

第二次

现在:

0 1 2

即:

left = 4 right = 6 mid = 5 nums[mid] = 1

看:

nums[left] <= nums[mid] 0 <= 1

成立。

说明:

左边 [0,1] 有序

target=0 是否在:

[0,1]

之间?

在。

所以:

去左边继续二分

即:

right = mid - 1

第三次

left = 4 right = 4 mid = 4

发现:

nums[mid] == target

返回 4。


三、最重要的理解

旋转数组虽然整体无序:

4 5 6 7 0 1 2

但它一定是:

一段升序 + 一段升序

所以:

每次二分后,一定至少有一边是完全有序的。

我们就利用这一边判断 target 在不在里面。


四、代码(最经典写法)

class Solution { public int longestValidParentheses(String s) { int max = 0; int[] dp = new int[s.length()]; for (int i = 1; i < s.length(); i++) { if (s.charAt(i) == ')') { // 1. () if (s.charAt(i - 1) == '(') { dp[i] = (i >= 2 ? dp[i - 2] : 0) + 2; } // 2. )) else if (i - dp[i - 1] - 1 >= 0 && s.charAt(i - dp[i - 1] - 1) == '(') { dp[i] = dp[i - 1] + 2; if (i - dp[i - 1] - 2 >= 0) { dp[i] += dp[i - dp[i - 1] - 2]; } } max = Math.max(max, dp[i]); } } return max; } }

五、你真正需要记住的只有两句话

1. 判断哪边有序

nums[left] <= nums[mid]

成立:

左边有序

否则:

右边有序

2. 判断 target 在不在有序区间

左边有序:

nums[left] <= target && target < nums[mid]

右边有序:

nums[mid] < target && target <= nums[right]

六、为什么时间复杂度还是 O(log n)

因为每次都:

砍掉一半区间

所以仍然是二分查找。


这题是二分查找里非常经典的一道“变形题”。

你如果已经会普通二分,这题真正难的点只有:

“每次一定有一半有序”

一旦理解这一点,后面就是普通二分逻辑了。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/11 22:54:04

WandEnhancer:解锁WeMod全部潜力,告别功能限制

WandEnhancer&#xff1a;解锁WeMod全部潜力&#xff0c;告别功能限制 【免费下载链接】Wand-Enhancer Advanced UX and interoperability extension for Wand (WeMod) app 项目地址: https://gitcode.com/gh_mirrors/we/Wand-Enhancer 您是否厌倦了WeMod免费版的种种限…

作者头像 李华
网站建设 2026/5/11 22:49:31

从PLY到3D视图:手把手教你用PCL Visualizer定制点云显示效果

从PLY到3D视图&#xff1a;手把手教你用PCL Visualizer定制点云显示效果 在三维点云处理领域&#xff0c;数据的可视化效果直接影响着分析效率和成果展示的专业度。许多开发者虽然能够通过PCL库加载PLY格式的点云数据&#xff0c;却常常止步于默认的黑底白点显示模式&#xff0…

作者头像 李华
网站建设 2026/5/11 22:35:27

服务器运维与DevOps融合:迈向智能化运维的新纪元

在数字化浪潮席卷全球的今天&#xff0c;企业对IT基础设施的依赖程度日益加深&#xff0c;服务器运维作为支撑业务连续性和系统稳定性的核心环节&#xff0c;正面临前所未有的挑战与机遇。传统运维模式依赖人工干预、响应滞后、效率低下&#xff0c;已难以满足现代业务快速迭代…

作者头像 李华
网站建设 2026/5/11 22:27:40

Docker Desktop 磁盘空间占用过大?手把手教你彻底瘦身

前言 很多使用 Docker Desktop for Windows 的同学都会遇到一个头疼的问题&#xff1a;明明没有拉取多少镜像&#xff0c;Docker 却占用了几十甚至上百 GB 的磁盘空间。更让人困惑的是&#xff0c;执行了 docker system prune 清理命令后&#xff0c;磁盘空间完全没有变化&…

作者头像 李华