【二分查找】LeetCode 33. 搜索旋转排序数组思路
题目链接
思路
都在注释里
代码
class Solution {
public int search(int[] nums, int target) {
int len = nums.length;
if(len == 0){
return -1;
}
int left = 0, right = len - 1;
// 1. 首先明白,旋转数组后,从中间划分,一定有一边是有序的。
// 2. 由于一定有一边是有序的,所以根据有序的两个边界值来判断目标值在有序一边还是无序一边
// 3. 这题找目标值,遇到目标值即返回
// 4. 注意:由于有序的一边的边界值可能等于目标值
// 所以判断目标值是否在有序的那边时应该加个等号(在二分查找某个具体值的时候如果把握不好边界值
// 可以在每次查找前判断下边界值,也就是while循环里面的两个if注释)
while(left <= right){
// if(nums[left] == target) return left;
// if(nums[right] == target) return right;
int mid = left + (right - left) / 2;
if(nums[mid] == target){
return mid;
}
// 右边有序
if(nums[mid] < nums[right]){
// 目标值在右边
if(target > nums[mid] && target <= nums[right]){
left = mid + 1;
// 目标值在左边
}else{
right = mid - 1;
}
// 左边有序
}else{
// 目标值在左边
if(target >= nums[left] && target < nums[mid]){
right = mid - 1;
// 目标值在右边
}else{
left = mid + 1;
}
}
}
return -1;
}
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 【自荐】一款简洁、开源的在线白板工具 Drawnix