代码随想录Day1(数组part1) 704-二分查找;27-移除元素

704-二分查找

题目链接https://leetcode.cn/problems/binary-search/

其实读完题目我就在没带电脑的情况下用手机写了44d4b90e5b3147aea3c46807f7a29af8.png

当时也没有想太多就直接跟着自己的逻辑写了一个,但后来看了随想录才发现有左闭右闭和左闭右开两个情况,我这个就是属于左闭右闭的情况,那么这两种情况说白了就是0~nums.length-1和0 ~nums.length。在通俗一点就是左边界和右边界的取值问题。这两种情况也就直接影响到while循环里的语句,如果是左闭右闭就是left小于等于right,另一种情况则是小于,如果还是不太清楚可以举个例子:数组为[1,2,4],target是3。在这种情况下左闭右闭是left=0,right=2,mid=1。while第一次循环时,因为mid索引的值为2小于3所以左边界要发生变化,那为啥要变成mid+1而不是mid,因为mid索引对应的值已经比较完了,另一种情况也同理。接下来左索引被付值为了2而右索引也是2,那么这个时候循环是否需要继续呢?一定要继续,因为右索引的值还没有和target的值进行比较,所以while还要执行,这时mid为2而mid所对应的值大于target,所以要改变右索引,右索引就变成了1,这时全部元素已经与target进行了比较,所以循环也可以停止,显而易见右索引小于左索引,所以这边解释了循环里的语句。

!看完随想录以后我发现我写的还是有个小问题,我没有加一个条件,就是当target的值小于0索引的值或大于length-1时则直接返回-1,这样可以避免多次循环运算。

27-移除元素

题目链接

 

https://leetcode.cn/problems/remove-element/b17d8a4035b54537a86ed2cff2e62fd0.png 

其实写的很糙,但我觉得大致的逻辑也没什么问题,也成功通过了,我写的时候就是想怎么才能在空间复杂度为O(1)的情况下完成呢,后来看了随想录的题解原来这个叫双指针,当时我只是觉得既然数组只能覆盖,那么我就可以找出那些和val不同的数,然后把他们覆盖在和val相同的位置,这时候我想到引入一个变量j,用它来表示扣去与val相同的数以后新数组的长度,我写的for循环里就是干这件事的,将于val不同的数从0索引开始依次付值。这就是j干的事。当然这题也有暴力解法,第一个循环遍历数组,第二个循环更新数组,这里注意第二个for循环的条件是满足i索引对应的值等于val时才会走第二个循环来进行从i+1位置依次往前覆盖来更新数组的操作 

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值