// class Solution {
// public int search(int[] nums, int target) {
// // 自己写的:二分查找
// int minIndex = 0;
// int maxIndex = nums.length - 1;
// int middleIndex = (minIndex + maxIndex) / 2;
// while(minIndex <= maxIndex){
// if (target < nums[middleIndex]){
// maxIndex = middleIndex;
// middleIndex = (minIndex + maxIndex) / 2;
// }else if(target > nums[middleIndex]){
// minIndex = middleIndex;
// middleIndex = (minIndex + maxIndex) / 2;
// }else{
// return middleIndex;
// }
// }
// return -1;
// }
// }
// class Solution {
// public int search(int[] nums, int target) {
// // 更正:二分查找 左闭右闭区间
// // 先排除极端情况
// if(target < nums[0] || target > nums[nums.length - 1]){
// return -1;
// }
// // 然后进行二分查找
// int minIndex = 0;
// int maxIndex = nums.length - 1;
// while(minIndex <= maxIndex){
// int middleIndex = minIndex + ((maxIndex - minIndex) >> 1);// 这样为什么可以防止溢出?
// if (target == nums[middleIndex]){
// return middleIndex;
// }else if(target > nums[middleIndex]){
// minIndex = middleIndex + 1;
// }else if(target < nums[middleIndex]){
// maxIndex = middleIndex - 1;
// }
// }
// return -1;
// }
// }
class Solution {
public int search(int[] nums, int target) {
// 更正:二分查找 左闭右开区间
// 先排除极端情况
if(target < nums[0] || target > nums[nums.length - 1]){
return -1;
}
// 然后进行二分查找
int minIndex = 0;
int maxIndex = nums.length;
while(minIndex < maxIndex){
int middleIndex = minIndex + ((maxIndex - minIndex) >> 1);// 这样为什么可以防止溢出?两数相加可能溢出,相减不会
if (target == nums[middleIndex]){
return middleIndex;
}else if(target > nums[middleIndex]){
minIndex = middleIndex + 1;
}else if(target < nums[middleIndex]){
maxIndex = middleIndex;
}
}
return -1;
}
}
leetcode 704.二分查找
最新推荐文章于 2024-09-14 18:52:56 发布
本文探讨了如何改进二分查找算法,通过调整左闭右开区间的边界并避免整数溢出问题。首先,排除极端目标值,接着使用位运算优化中间索引计算。通过实例代码展示了优化后的搜索逻辑和其在`Solution`类中的应用。
摘要由CSDN通过智能技术生成