704.二分查找
使用二分法的前提:
- 数组有序且无重复元素
左闭右开
public static int search(int[] nums, int target) {
int left = 0;
int right = nums.length;
while (left < right) {
int middle = left + (right - left)/2;
if (target < nums[middle]) {
right = middle;
} else if (target > nums[middle]) {
left = middle + 1;
} else if (target == nums[middle]){
return middle;
}
}
return -1;
}
左闭右闭
public static int search(int[] nums, int target) {
int left = 0;
int right = nums.length - 1;
while (left <= right) {
int middle = left + (right - left)/2;
if (target < nums[middle]) {
right = middle - 1;
} else if (target > nums[middle]) {
left = middle + 1;
} else if (target == nums[middle]){
return middle;
}
}
return -1;
}
⚠️注意:边界问题
- 左闭右闭时left == right 有意义,所以需要用<=
- 左闭右闭且当target在左区间时,right = middle - 1,此时nums[middle]一定不是target,又因为是左闭右闭区间所以结束下标范围为middle - 1
- 为什么当target在右区间时left = middle + 1?无论区间是左闭右闭还是左闭右开,当target在右区间时,nums[middle]一定不是target,都是左闭区间所以结束下标范围为middle + 1;避免死循环
27.移除元素
数组的元素在内存地址中是连续的,不能单独删除数组中的某个元素,只能覆盖。
双指针法:通过一个快指针和一个慢指针在一个for循环下完成两个for循环的工作
快指针作用:寻找新数组的元素,即不含目标元素的数组
慢指针作用:更新新数组指向的下标的位置
class Solution {
public int removeElement(int[] nums, int val) {
int left = 0;
int right = 0;
while (right < nums.length) {
if (nums[right] == val) {
right++;
} else {
nums[left] = nums[right];
left++;
right++;
}
}
return left;
}
}