题目:
https://leetcode.cn/problems/binary-search/submissions/537498050/
代码随想录解析:
https://programmercarl.com/0704.二分查找.html#思路
并不熟悉区间不变,很容易写乱,一定要清晰的知道自己的边界。
特别需要注意的是,如果为左闭右开,则while中的判断是<;
如果为左闭右闭,则while中的判断是<=;
此外这个还影响到后续target中的判断,如果为左闭右闭的话,则在
if (nums[middle] > target) {
right = middle - 1; // target 在左区间,所以[left, middle - 1]
如果为左闭右开的话则不需要减1;
此外还有一个非常有意思的地方是这里寻找中点的方法为:
int middle = left + ((right - left) / 2);// 防止溢出 等同于(left + right)/2
这是几个需要注意的点。
题目:
https://leetcode.cn/problems/remove-element/
代码随想录解析:
https://programmercarl.com/0027.移除元素.html#思路
这道题我用的是暴力解法和双指针都用了下,
其中让我注意到的是暴力解法中的i--
这里为什么要使用i--呢,这是因为:
不使用 i-- 会导致在移除元素后,紧跟在被移除元素后的元素被跳过,未被检查,从而无法正确移除所有目标值。
这是因为在移除元素后,数组中的元素向前移动,但循环中的索引 i 继续向前增加,导致新移到当前索引位置的元素未被检查。