Day1-代码随想录刷题力扣(704:二分查找,27:移除元素)

Day1-代码随想录刷题力扣(704:二分查找,27:移除元素)@TOC

27:移除元素

*之前刷过一遍这题,凭着零星的记忆,只记得是要覆盖元素,全然忘了用双指针中的快慢指针进行解题。果然多刷几遍是超级有必要的。反正如果我自己做,是想不到用双指针来做的,会用笨办法,我那仅有的三脚猫功夫“两层for循环遍历”来做。

但毕竟刷题嘛,总是要学一些新思想的,本题使用双指针解决覆盖问题,就很巧妙。快指针相当于去探索下一个元素是不是需要删除的元素,而慢指针相当于在家里“收获成果”。这有点像是排序中的“插入排序”的思想,总是默认前面的(这里指的是慢指针所指向的元素的前面的所有元素)是排序好的(在这里是指删除后得到的新数组)。[可能我这么描述只能我自己看得懂吧!哈哈]

704:二分查找

这个代码随想录中的视频中,讲的很明白了,看了一遍就刻进骨子里了。就不多说了。不过还是要注意,使用二分查找之前要先要对数组进行排序!如果是返回索引的题,就比这么干了,一旦排序,索引就乱了。
(1)不过群里还在讨论,如何写mid的赋值可以有效防止溢出,这个点要好好看一下。将mid=(left+right)//2 改写成mid=left+((right-left)/2)可防止溢出。为啥呢:
“当给定的数组长度很长,待查找元素的位置靠近数组尾部时,当循环快结束时,left和right可能都会很大,还没等除以2求得平均值,left+right求和的值就已经超出了int最大范围,导致溢出错误。”
(2)在写while()里面是left<right还是left<=right,觉得这里还是习惯写left<=right,为啥呢,这样只需要考虑,只要left>right就返回的情况,而无需再考虑left=right的时候咋办。

总结:

今天做了两道题,也就复习了两道题。这两道题,都是用两个指针来做的。
第一个27题移除元素,是使用双指针,定义一个快指针和一个慢指针,快指针的增加就让“借着”for循环的“东风”,来进行快指针++,慢指针就在for循环外面定义一个,然后根据条件再从for循环里面让慢指针++。
大体结构是:
slow=0
for(fast=0,fast<len(num),fast++):
if():
slow++
类似这样。
第二个是704题,二分查找。是定义左右指针。
大体是这样的构造:
left=0
right=len(nums)-1
mid=(left+right)//2
while(left<=right):
根据nums[mid]的值,决定是left++还是right–!

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值