二分查找典型题。
应用场景:
1.数组有序(升序/降序)。
2.查找目标值,或者查找某个范围的值。
3.时间复杂度要求 O(logn)。
注意点:
1.避免溢出,
int mid = (right - left) / 2 + left;
避免 (left + right)
直接相加可能引发整型溢出。(Java中int类型最大只有21亿左右)
2.边界条件
确保每次都检查 left
和 right
边界,防止遗漏可能的结果。如果选择left = 0, right = nums.length(),范围是左闭右开,那么判断条件就应该是while (left < right),
如果选择left = 0, right = nums.length() - 1,范围是左闭右闭,那么判断条件就应该是while (left <= right)。
class Solution {
public int search(int[] nums, int target) {
// 剪枝
if(target < nums[0] || target > nums[nums.length-1]){
return -1;
}
int left = 0;
int right = nums.length - 1;
while(left<= right){
int mid = (right - left) / 2 + left;
if(nums[mid] == target){
return mid;
}
else if(nums[mid] < target){
left = mid + 1;
}else{
right = mid - 1;
}
}
return -1;
}
}
下一篇双指针经典题leetcode 27。