No.1
题目
二分查找
思路
- 要素:原数组升序排列
- 清楚地定义左右边界
- 优化空间:数组有序,通过第0元素和最后元素,可以避免查找不在数组范围内的target
代码
public static int search(int[] nums, int target) {
// 避免target小于nums[0],大于nums[nums.length-1]时参与运算
if (target < nums[0] || target > nums[nums.length - 1]) {
return -1;
}
// 使用左闭右闭区间写的 [left, right] int left = 0, right = nums.length - 1;
while (left <= right) {
// 中间位置
int mid = left + (right - left) / 2; // 避免大数相加导致溢出
if (nums[mid] == target)
return mid;
else if (nums[mid] < target)
left = mid + 1;
else
right = mid - 1;
}
return -1;
}
No.2
题目
移除元素
思路
- 原地去除数组元素,直接用非
val
值覆盖即可
- 双"指针":"指针"
cur
记录当前录入位置,"指针"p
查找不等于val
的数组值
- 思路简单明了,但实现起来容易出错,最好用for循环控制
fastIndex
增加——fastIndex
无条件增加,slowIndex
只在满足if条件时增加
代码
public static 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;
}