704 二分查找法
题目链接力扣
注意
1.左闭右闭区间和左闭右开的区别。
2.以及if(num[milddle]>taget) 还是 >=taget。
3.left和right两个int相加,超过int最大值越界的情况。
第一种写法 左闭右闭区间
class Solution {
public int search(int[] nums, int target) {
int left = 0;
int right = nums.length - 1;
int middle = 0;
while (left <= right) {
// middle = (right + left) / 2;
middle = left+(right-left)/2;
if (nums[middle] > target) {//[left, middle - 1]
right = middle-1;
} else if (nums[middle]<target){//[left + 1, middle]
left = middle+1;
}else {
return middle;
}
}
return -1;
}
}
第二种写法 左闭右开空间
几点不一样:
[left,right]中 right=left是有意义的 比如【1,1】是可以走到1的,因此循环条件为while(left<=right)
[left,right)中 right=left不存在 比如没有【1,1)这种区间。因此循环条件为while(left<right)
第二 注意 当middle >= target right= middle。
class Solution2 {
public int search(int[] nums, int target) {
int left = 0;
int right = nums.length - 1;
int middle = 0;
while (left < right) {
// middle = (right + left) / 2;
middle = left + (right - left) / 2;
if (nums[middle] == target) {
return middle;
}
if (nums[middle] >= target) {
right = middle;// target 在左区间,在[left, middle)中
} else {
left = middle+1;// target 在右区间,在[left+1, middle)中
}
}
return -1;
}
}
leetCode 27 移除数组中的元素
class Solution {
public int removeElement(int[] nums, int val) {
// 快慢指针
int slowIndex = 0;
for (int fastIndex = 0; fastIndex < nums.length; fastIndex++) {
if (nums[fastIndex] != val) {
nums[slowIndex] = nums[fastIndex];
slowIndex++;
}
}
return slowIndex;
}
}
文章详细对比了两种二分查找法的实现,一种是左闭右闭区间,另一种是左闭右开区间,并在LeetCode的题目中进行应用。同时,提到了在处理区间时需要注意的边界条件和比较操作。另外,还介绍了一个移除数组元素的问题,使用了快慢指针的方法。
563





