DAY 1:704.二分查找&&27.移除元素

文章介绍了二分查找的两种区间表示,包括[left,right)和[left,right],并提供了相应的Python代码实现。同时,文章提到了元素移除问题,分别用暴力解法和快慢指针法进行了解决,强调了循环控制和指针移动的细节。
摘要由CSDN通过智能技术生成

704.二分查找 力扣题目传送门

AC过后的感受:之前做过一次这题,当时也看到了卡哥的题解(卡哥题解传送锚点哈),感觉恍然大悟——原来自己晕的是+还是-  1的问题是区间开闭的问题。不过这次选在【left,right)这种开始写,还是出错,需要再理清楚一遍。

我感觉开闭区间主要还是在判断条件是否能等于的时候考虑,以及循环中的left+1  right-1依然是考虑到在if 判断时是否比较过这个值了  或者说是区间是否取到这个值了  取到了 那就下一个  没取到那就要取当前这个(enmmmm感觉我描述的不明不白的  但是我感觉我是真的明白了(哭笑不得.jpg))

方法一:采用[left,right)方式   

class Solution(object):
    def search(self, nums, target):
        """
        :type nums: List[int]
        :type target: int
        :rtype: int
        """
        left = 0
        right = len(nums)#这里因为是[left,right) 右边是开区间,所以取数组长度那个值是取不到的
        # middle = (left + right)/2
        # [left,right)
        while(left < right):
            middle = (left + right)/2
            if(target < nums[middle]):
                right = middle  
            elif(target > nums[middle]):
                left = middle +1 #这里如果不进行+1  代码可能就会在一直一遍遍循环再left=middle中(调试亲测)
            else:
                return middle
        return -1

方法二:采用[left,right]方式 

对于right的初始值取值!!通过初始值取值的不同也是区分开闭区间的好方法   (这里真的是个小坑啦  明白了之后就可以“乱杀”啦)

class Solution(object):
    def search(self, nums, target):
        """
        :type nums: List[int]
        :type target: int
        :rtype: int
        """
        left = 0
        right = len(nums)-1 #这里的-1要加哦 因为是闭区间,所以两端要都可以取到 这也是与[left,right)有区别的地方
        # [left,right]
        while(left <= right):
            middle = (left + right)/2
            if(target < nums[middle]):
                right = middle-1  #要保证端点的值是可以取到的
            elif(target > nums[middle]):
                left = middle +1 #同上哈
            else:
                return middle
        return -1

27.元素移除(力扣题目传送门)

尽管之前已经做过一次啦 也了解过快慢指针这个东西,但是第一想法还是暴解

方法一:暴力解法

(小插曲:之前第一次写这个题是用C++写的,嵌套循环还挺容易整出来的,这次用太久没捡起来用的python写给我绕进去了

笑死,系统刷题第一天,败在python的for循环上   不可以!!)

 

debug时发现了for循环困住了i,我还没想到如果还用for要怎么实现,看到群里刚好有人讨论说用while会容易控制i一些

下面试AC的暴力解决的代码啦(有很多代码书写可能不够规范(装晕.jpg(别骂啦别骂啦在改啦在改啦)))

class Solution(object):
    def removeElement(self, nums, val):
        """
        :type nums: List[int]
        :type val: int
        :rtype: int
        """
        l =len(nums)-1 #这里的-1和下面while 的条件要对应起来 enmmmm应该没错 
        i=0
        while i<=l :
            if nums[i]==val :
                for j in range(i,l):
                    nums[j]=nums[j+1]
                l-=1
            else:
                i+=1
        return l+1

方法二:快慢指针

快指针负责在前面探路,遇到target就删去

慢指针善后,把每个非target的元素一个个纳入数组中 

我经常晕的点!!在下面代码中有注释解释

class Solution:
    def removeElement(self, nums: List[int], val: int) -> int:
        size=len(nums)-1 #其实这个-1主要就是看你这个size表达的是数组的长度还是数组下标 
        # 如果是数组长度 那就不用-1 下面whlie控制循环那里就当然也不可以=啦
        # 如果是表示下标 那就要-1啦  下面while控制循环就相应也可以=
        fast=0
        slow=0
        while fast<=size:#因为fast负责探路嘛 所以用它来控制循环
            if nums[fast] != val:
                nums[slow] = nums[fast]
                slow += 1
            fast += 1
        return slow

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值