总体感觉,Debug无压力,这么些年的测试还是没有白做,debug的过程帮助更好理解数据/模型内部的关系
704. 二分查找
在这之前自己刷到了二叉树,已经算是二刷了,本以为这个还是比较简单,手撕的时候竟然还是有问题,看来什么事情还是要沉一些,再沉一些。
左闭右开:
- 初始值
- right赋值的时候,mid是不包含的,所以要 right = mid
左闭右闭,
- 初始值
- right赋值
- while的条件left <= right
左开右闭,
- 初始值,
- left的赋值
- while的条件
- mid的取值(要偏向于右侧也就是闭区间的部分)mid = (left + right)//2 + 1
左闭右闭的时候,mid不能偏向于右侧,但是可以mid = (left + right)//2 或者 mid = round((left+right)//2)
这样看起来几种写法,还是相当具有对称的美的,总结一句话,注意循环不变量
27. 移除元素
暴力法,踩的坑有
- 数组的长度在变化,需要巧妙处理,用--比用找一个counter++好
- python中的for是一个迭代器,固定下的,在循环过程修改里面的计数器和边界条件,都会有问题,用while替代
双指针法:双指针有很多方式,
- right/left
- slow/fast: 判断无限循环的,fast走两步,slow走一步。还有根据题目具体条件设置的
双指针法要清楚,什么时候交换
- 指针要移动到 nums[right]!=value并且nums[left]==value
如果while left < right, nums只有一个元素的时候, right = left, 就进入不了循环了。所以应该是while left<=right
35. 搜索插入位置
开心,一遍过,其实就是左闭右开,找左边,退出循环的时候,就是左边界。换句话说,就是最小的地方。
左闭右闭的情况,返回的是right + 1,也就是left,这种情况下,最终是right,left这样的位置关系
暴力法不是最坏的,特别是针对这道题
34. 在排序数组中查找元素的第一个和最后一个位置
手撕分别找左右,一遍过。注意 nums[mid]==target的时候,
- 取左边的时候,可以放成右开 right = mid,这时候left兜底,是闭的
- 取右边的时候,可以放成左开 left= mid,这时候right兜底,是闭的
最后的左右如果不满足left < right的时候,是有问题的,就是没有找到
又看了好多种别人的方法,比如左闭右闭,只找相等的时候
69. x的平方根
不需要构造数组,直接用mid就可以
right 不能只是取到x//2,要考虑输入1的情况,所以right要取到x
367.有效的完全平方数
左闭右闭
26. 删除有序数组中的重复项
双指针,slow/fast, 注意从1开始
283. 移动零
list的分片填充
另外一种思路,pop出重复元素,在末尾加0
844. 比较含退格的字符串
注意处理好#之前没有字符的情况,此时slow = 0,遇到#的时候,slow就不能再-1了