【二分查找】LeetCode 153. 寻找旋转排序数组中的最小值
题目链接
思路
首先分析一下旋转数组可能有的状态:
- 左 < 中 < 右,此时最小值肯定在左边,应当收缩右边界
- 左 < 中,中 > 右,此时最小值肯定在右半段,应当收缩左边界
- 左 > 中,中 < 右,此时最小值肯定在左半段,应当收缩右边界
分析这三种状态可以发现,中值小于右值时收缩右边界,否则收缩左边界。
那么当中值等于右值时呢?因为本题没有重复元素且使用的是地板除,即 mid 更靠近 left,所以当中值与右值相等时说明
代码
class Solution {
public int findMin(int[] nums) {
int left = 0;
int right = nums.length - 1;
while(left < right){
// 经典操作防止溢出
// 地板除,mid更靠近left
int mid = (right - left) / 2 + left;
// 中值 > 右值,最小值在右半边,收缩左边界
if(nums[mid] > nums[right]){
left = mid + 1;
}else{
// 中值 < 右值,最小值在左半边,收缩右边界
// 因为中值 < 右值,中值也可能是最小值,右边界只能取到mid处
right = mid;
}
}
return nums[left];
}
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?