python刷leetcode数组题注意事项

48 阅读3分钟

我又来面对算法题了,唉,这次跟着代码随想录刷数组题

其实从大一开始就觉得自己思考算法题的脑回路和正常人不太一样,所以开帖记录一些自己需要记住的注意事情

二分查找

  • 大多数语言的除法都是向下取证
  • middle=(left+right)/2不会忽略中间的middle元素,不用担心
  • middle=(right-left)/2只计算了偏移量
  • while left <= right:的话是左闭右闭,那么right = len-1,判断是nums[middle]<target时候结束条件是`left = middle + 1
  • while left < right:的话是左闭右开,那么right = len,判断条件是nums[middle]<target结束条件是left = middle

移除元素

从这一章开始学习双指针:快指针和慢指针一起控制元素移动。要求原地移除等于val的元素

  • 元素移动不需要再开一个循环
  • python的for循环i会自动回到初始赋值,所以用while避免数组长度改变导致的数组越界的情况。暴力也要写while
  • 快指针来遍历数组,慢指针来搜集不等于val的位置
class Solution:
    def removeElement(self, nums: List[int], val: int) -> int:
        # 快慢指针
        fast = 0  # 快指针
        slow = 0  # 慢指针
        size = len(nums)
        while fast < size:  # 不加等于是因为,a = size 时,nums[a] 会越界
            # slow 用来收集不等于 val 的值,如果 fast 对应值不等于 val,则把它与 slow 替换
            if nums[fast] != val:
                nums[slow] = nums[fast]
                slow += 1
            fast += 1
        return slow

删除有序数组中的重复项

  • 思路:因为是有序数组,所以移除重复项 = 把不相同的元素移到左边
  • 先判等,如果快慢指针位置对应的元素不相等,快指针元素放到慢指针+1位上,然后慢指针后移一位,然后快指针后移。如果快慢指针位置对应元素相等,直接快指针后移
  • 慢指针从0开始,所以返回慢指针位置+1才是数组长度

移动零

  • 快慢指针都从0开始

比较含退格的字符串

  • 继续用快慢指针解体,栈虽然好理解,但下次一定
  • python不能直接处理字符串,因为字符串是常量,一定要list一下s=list(s)
  • 思路:快指针扫整个数组,遇到不是#就记录一下,慢指针记录真正的做完退格的字符串,每次遇到#,slow就会退一位,相当于删掉了
  • 操作字符串,返回[0:slow],不包含slow的位置
class Solution(object):
    def backspaceCompare(self, s, t):
        def processe(s):
            # if len(s) <= 1:
            #     return s 这个边界条件不能加
            slow = 0
            fast = 0
            s = list(s)
            while fast < len(s):
                if s[fast]!= "#":                    
                    s[slow]=s[fast]
                    slow+=1
                elif slow > 0: #slow退一格,如果slow=0那就不退
                    slow -=1
                fast+=1
            res = s[0:slow]
            return res
            
        s=processe(s)
        t=processe(t)

        if s==t:
            return True
        return False
  • c++等语言的++符号,nums[slow++] = nums[fast]==> nums[slow] = nums[fast] slow += 1,i++是先用后加,用的时候是原来的值,不是加一以后的值

有序数组的平方

  • python!!排序!!哎我服了自己了就是分不清楚var.sort和sorted(var)。
    • list.sort() 方法会对列表进行原地排序(即在原列表上进行排序),它不会返回新的列表,而是返回 None
      • `numsr = [i**2 for i in nums]        numsr.sort()      return numsr`
        
    • sorted() 函数,它会返回一个新的排序后的列表
      •     `numsr = [i**2 for i in nums]        return sorted(numsr)`
        
  • 不投机取巧版:双指针,新数组。左边一个右边一个,其实平方之后数组的排序是V字型,所以新数组从最大(最右边)的开始放,放更大的那一个,放完之后新数组下标减一
    • 编程注意:new = [0] * len(nums)这样数组下标才不会越界,之前的new = [] new.append(xxx)是动态增长,不适合这个题。
    • 但反正不能new = [] 直接搭配 new[100] = x 这样使用。切记切记!!

长度最小的子数组

开始滑动窗口!明天继续!