开始看到这个题目觉得应该挺轻松,毕竟是经典直球的二分查找题,尽管已经有一段时间没做了但是认为自己应该不会出什么问题,结果一提交发现超时。
虽然折腾了3分钟将right = mid 改成mid +1 已经把while终止条件改为left <= right 后通过了,但是多少有点一知半解 遂去看代码随想录讲解视频。
视频链接如下:
手把手带你撕出正确的二分法 | 二分查找法 | 二分搜索法 | LeetCode:704. 二分查找_哔哩哔哩_bilibili
题后总结
这个视频确实对不熟悉二分查找法细节的人是非常有帮助的,首先是对常用的左闭右闭区间的细节做了分析,对于边界划分模糊的我受益匪浅。譬如 left == right 在左闭右闭区间中是有意义的,以及当nums[mid] > target 时 应该把右边界更新为mid - 1而不应该保留无效区间,否则在力扣上会超时。
给你一个数组 nums
和一个值 val
,你需要 原地 移除所有数值等于 val
的元素,并返回移除后数组的新长度。
不要使用额外的数组空间,你必须仅使用 O(1)
额外空间并 原地 修改输入数组。
元素的顺序可以改变。你不需要考虑数组中超出新长度后面的元素。
按照惯例先摸索再看视频,由于刚刚做过二分查找视频第一反应是能不能用类似的方法解决,发现题目说元素顺序可以改变后就想能不能把排序后列表中要删除的元素左边界和右边界找出来,试了一下用以下代码通过了。
遂看视频学习,链接如下:
数组中移除元素并不容易! | LeetCode:27. 移除元素_哔哩哔哩_bilibili
然后发现这种覆盖元素的解法真是巧妙,但是略有一点烧脑,尤其是第一遍看快慢指针的作用是对代码的加减操作感到不解, 但是理解以后也感觉收获颇丰。