代码随想录刷题思路与心得01| 704. 二分查找、27. 移除元素

704.二分查找:

        个人觉得想要掌握二分法,需要掌握两个部分:1.如何使用二分 2.什么时候适合使用

        首先对于如何使用,二分法本身思路不难,主要是抓住开闭区间的差别。以704题为例:

         题目本身很直观,就是寻找某一个数值(未找到返回-1)。而在进行二分查找时最容易弄混的在于一些细节条件,我觉得最重要的,也是最容易出错的地方有三处:1.左右边界的初始值 2.循环中左右的判断条件 3.左右指针的变化。

左闭右开解法:

        本题有两个主流解法,首先是左闭右开区间: [left, right)。如果假设寻找的数值在这里面,那么可以依次回答上述三个问题。1.left和right初始值:因为我们搜索不想错过任何一个数值,那么最开始left是闭区间,就应该从0开始,这样把第一个数包含在内了。而对于right,由于是开区间,right应该等于数组长度而非长度减一,因为开区间不包括在内,因此需要多一个才能全部包含数组。 2.left和right判断条件:由于是左闭右开区间,当left == right时,这个区间已经没有意义了,因此等到二者相等时就可以结束了,那么判断条件就可以写成while left < right。 3.left和right变化:同样是因为左闭右开,我们希望每次循环时,判断过的数就不要继续保留了,那么对于left,由于是闭区间,如果left = mid的话,对于闭区间来说这个判断过不合适的mid其实还是留下来了,那么就会引起死循环,因此需要left = mid + 1来去掉它。而对于right来说,由于是开区间,本身就不含它自己,那么right = mid就已经去掉了mid,如果等于mid - 1会额外去掉一个值。

当分析完这三个点后,本题就可以简单写出:

 左闭右闭解法:

        和之前类似,只是判断区间改为了[left, right]。那么同样需要解决那三个问题:1.此时两边都是闭区间,开头和结尾对应的数都不能少,那么left, right = 0,len(nums) - 1。 2.判断条件处,由于两边都是闭区间,left == right时是有意义的,那么为了遍历完整,就应该有等号。 3.left和right的更新,由于两边都是闭区间,每一次就应该额外前进或者后退一个数,也就是+1和-1都不能少。具体解法如下:

        对于二分法什么时候使用 ,主要是为了减少时间复杂度,使得只遍历一半就达到目的,时间复杂度为O(logn)。而使用前应该注意,数组一定是要排序的,无序的是无法使用的。

27.移除元素

        这是一个双指针的比较基础的一个题目。因为题目中要求原地修改,就不能新开辟一个list记录数据了。其实这道题如果能想到新开一个list如何解决,就离答案不远了。如果可以新用一个list,那么就可以遍历旧的list,找到合适的放在新的里面。那么这道题需要的是遍历旧的list,放到旧的里面,此时就需要双指针方法。个人认为核心思路就一句话,‘用慢指针记录位置’。慢指针作用就相当于新建一个list,那么接下来的工作就很简单了,每次快指针发现有符合条件的数,就放到慢指针那里,由于快指针每次都移动而慢指针不是,那么就不会存在覆盖情况。题解如下:

其它: 

学习时长:2h

学习心得:深入理解二分法,并且学到了每次结束条件都是刚好不符合循环条件的时候

学习链接:https://github.com/youngyangyang04/leetcode-master/blob/master/problems/0704.%E4%BA%8C%E5%88%86%E6%9F%A5%E6%89%BE.md

https://github.com/youngyangyang04/leetcode-master/blob/master/problems/0027.%E7%A7%BB%E9%99%A4%E5%85%83%E7%B4%A0.md

感谢代码随想录!

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值