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

67 阅读1分钟
  • 今日学习的文章链接:programmercarl.com/%E6%95%B0%E…

  • 自己看到题目的第一想法: 二分法我应该会啊,结果还有哪里不对呢,经常要多次调试才能得到正确答案

  • 看完代码随想录之后的想法 : 第一次看的时候感觉非常不错,有重点难点,有解释。 但是Python栈还是会有一些不完善的地方,有一些解法是没有的,但是会督促我自己去好好实现,因为有答案,就会想看答案最容易了,现在是看Java的代码考虑Python的解法是什么。

  • 自己实现过程中遇到哪些困难 :暴力解法也会遇到一些问题

  • 今日收获,记录一下自己的学习时长:最近生病了,还要准备搬家,一刷过也花了两天才搞完

题目链接

leetcode.cn/problems/bi…

二分法:解法的共同点

  • 大于或小于的值就不能在查找范围内了,所以left=mid+1
  • mid=left+(right-left)//2,是因为mid不能超出right,//会略去余数

解法一:左闭右开

重点:left<right,等于的情况会在<时就已经比较过了,增加=会多做一次

class Solution:
    def search(self, nums: List[int], target: int) -> int:
        left,right=0,len(nums)
        while left <right:
            mid=left+(right-left)//2
            if nums [mid]<target:
                left=mid+1
            elif nums [mid]==target:
                return mid
            elif nums[mid]>target:
                right=mid
        return -1

解法二:左闭右闭

重点:left<=right,等于的情况会在=时还没有比较,所以是有意义的

class Solution:
    def search(self, nums: List[int], target: int) -> int:
        left,right=0,len(nums)-1
        while left <=right:
            mid=left+(right-left)//2
            if nums [mid]<target:
                left=mid+1
            elif nums [mid]==target:
                return mid-1
            elif nums[mid]>target:
                right=mid
        return -1

27.移除元素

class Solution:
    def removeElement(self, nums: List[int], val: int) -> int:
        #if nums=
        n=len (nums)
        left,right=0,n-1
        i=0
        while i <n:
            if nums [i]==val:
                for j in range (i+1,n):
                    nums[j-1]=nums[j]
                i=i-1
                n =n-1
            i+=1
        return n

双向指针:

注意点有点多

  • 除了提前判断right是否可以赋值给left,还需要在while中判断后续的right是否能赋值给left
  • left=right是有意义的因为=时还没有比较
class Solution:
    def removeElement(self, nums: List[int], val: int) -> int:
        
        n=len (nums)
        left,right=0,n-1
        while left<=right and right>=0 and nums [right]==val:
                right=right-1
        
        while left<=right:
            if nums[left]==val:
                nums[left]=nums[right]
                right-=1
            #if nums[left]==val:
            left += 1
            while right>=0 and nums[right]=val:
                right-=1
        return left