代码随想录算法训练营第一天 | 704. 二分查找,27. 移除元素

2道题都有一样的问题,拿到题目没感觉,之后看完答案基本可以手写,应该是生疏的问题。

二分查找​​​​​​​704. 二分查找 - 力扣(LeetCode)

for left>=right

和while差不多意思,go没有while只有for循环,当左边界大于等于右边界则说明二分结束了,已查找完区间,若是左闭右闭则可以等于。

二分区间划分为①[a,b],②[a,b)

但是不知道为什么一般这样划(后续补充)

①:

for left>=right{
        mid:=left+(right-left)/2    
        if nums[mid]>target{
                    right=mid--       
      }else if nums[mid]<target{
             left=mid++                   
      }else {
                 return mid
}
}

判断分三种情况,if语句中不能加等号因为等于就找到了,不需要再划分区间了,因为是闭区间,所以nums[mid]>target则nms【mid】一定不等于target,所以从后一位开始就可以了。

二分法逻辑是先划分二分区间,分两种情况,如果都不是则说明找到了。

补充一下go的if语句好久没写了忘完了:

和c++差不多,else if加判断条件可以有很多条,else只准一条并且没有判断条件。

 移除元素27. 移除元素 - 力扣(LeetCode)

题目拿到手也没想法,不知道怎么做,不知道是没有深入理解的原因,总是看了答案懂了怎么做就做出来了,但是好像少了点什么,也许是对逻辑的思考。

这个题不能新建数组,答案用双指针解决,我至今未知为什么要使用双指针,我的理解是一个用来扫描,一个用来保存。

for right<len(nums);right++{
                if nums[right]!=val{
                    nums[slow]=nums[right]
                        slow++
}
}

思路是l和r指针,r负责扫描数组,而扫描到的正确的数就放入数组,即用nums[l]来实现,放入之后l后移一位,若扫描到要删除的数,则不操作就行,最后相当于把需要的数都放入了nums,生成了新数组。

用len()来输出数组长度,数组存放于一段连续的地址,开辟了就不能更改大小只能移位子,如果想要删元素,其实只能新建数组。这个也只不过是整体前移,后面有空的,长度仍不变。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值