Day1,数组01

    总体感觉,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了

  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值