704. 二分查找
背景
查找的数组是有序
public int search(int[] nums, int target) {
int max = nums.length;
int min = 0;
while (min < max) {
int mid = (min + max) / 2;
if (nums[mid] == target) {
return mid;
} else if (nums[mid] > target) {
max = mid;
} else {
min = mid + 1;
}
}
return -1;
}
思路
1、设置要查找的区间是左闭右闭还是左闭右开,以确定while循环条件
2、如果是左闭右闭
2.1、那么当target>mid时,则缩小左区间,同时left = mid +1,因为mid已经检查过了,可以跳过mid下标元素
2.2、那么当target<mid时,则缩小右区间,同时right= mid -1,因为mid已经检查过了,可以跳过mid下标元素
3、如果是左闭右开
3.1、那么当target>mid时,则缩小左区间,同时left = mid +1,因为mid已经检查过了,可以跳过mid下标元素
3.2、那么当target<mid时,则缩小右区间,同时right= mid ,要保持左闭右开区间
4、当taget=mid时,则直接返回(不讨论是否有重复元素存在)
技巧:先设置查找区间,查找过程中保持区间格式不变
27. 移除元素
public int removeElement(int[] nums, int val) {
if (nums.length == 0)return 0;
int slow = 0;
for (int i = 0; i < nums.length; i++) {
if (nums[i] != val){
nums[slow++] = nums[i];
}
}
return slow;
}
思路
1、遍历数组
2、遍历过程中,删除的元素不符合时,重新添加到原数组中,其中使用慢指针指向新数据添加的元素,最后返回慢指针即可