代码随想录算法训练营第一天| 704. 二分查找、27. 移除元素
两道题
704.二分查找
1、数组算是最简单,也最不抽象的数据结构了。二分法,我也在学习路上听过不少次,所以是实际实现也很快,没有什么问题,谈不上多少收获和疑问。简单贴个代码一闪而过了。
2、在看评论区的时候,有一个很细,很有心机的收获:
medium = left + (right - left) / 2; //就只是为了防止 int 溢出
所以在写笔记的时候最终代码修改为:
class Solution {
public int search(int[] nums, int target) {
int right = nums.length - 1, left = 0;
int medium;
while (right >= left) {
medium = left + (right - left) / 2; // 这里有点心眼
if (nums[medium] == target) {
return medium;
} else if (nums[medium] < target) {
left = medium + 1;
} else {
right = medium - 1;
}
}
return -1;
}
}
27. 移除元素
第一次写的时候,以为很简单,还自以为是的先用二分法找,然后再把后面的元素覆盖上来。接着运行的时候发现二分法必须是排好序的数组,接着想到还需要排序,果断选择了暴力解法。
第二次就肯定是用更快速高效的方法 --- 双指针 ,如果不知道双指针,我可能是一辈子想不到有这个方法的。

代码如下:
class Solution {
public int removeElement(int[] nums, int val) {
int fast = 0, slow = 0;
for (fast = 0; fast < nums.length; fast++) {
if (nums[fast] != val) {
nums[slow] = nums[fast];
slow++;
}
}
return slow;
}
}
省流
1、704里的收获:一点小心机
2、27的图
3、数组删除元素真正的逻辑 -- 把目标元素后面的一路覆盖上来

浙公网安备 33010602011771号