1. LeetCode704 二分查找
题解: 二分查找重点是在left区间和right区间上,如左闭右闭还是左闭右开,如何区分? 主要就是可以采用同数代入的方法,比如[1,1] 1为有效数字,则判断条件就是left<=right;[1,1) 1为无效数字,因此就应该是left<right。代码如下:
1.1 左闭右闭的写法
public int search(int[] nums, int target) {
int left = 0;
int right = nums.length-1;
while (left <= right ) {
int middle = (left + right ) / 2;
if (nums[middle] > target ) {
right = middle - 1; // 因为是左闭右闭,所以判断完middle> target 右区间就不应该包含middle了
} else if (nums[middle] < target) {
left = middle + 1;
} else {
return middle;
}
}
return -1;
}
}
1.2 左闭右开的写法
public int search(int[] nums, int target) {
int left = 0;
int right = nums.length;
while (left < right) {
int middle = (left + right) / 2;
if (nums[middle] > target) {
right = middle; // 因为左闭右开 所以右区间为middle
} else if (nums[middle] < target) {
left = middle + 1;
} else {
return middle;
}
}
return -1;
}
}
2. 移除元素
题解: 移除等于val的元素,我们首先想到的就是新建一个空数组,遍历当前数组,把不等于val的放入另外一个数组中去,那么可不可以不创建新数组就能够实现呢?当然可以,比如我们可以采用双指针法,在该数组中i用于遍历整个数组,j指针用于标记不等于val的数,最后就可以把数组中等于val的元素移除掉了,代码如下:
public int removeElement(int[] nums, int val) {
int j = 0;
for ( int i = 0; i < nums.length; i++ ) {
if (nums[i] != val ) {
nums[j] = nums[i];
j++;
}
}
return j;
}
}