秋招算法备战第2天 | 977.有序数组的平方、209.长度最小的子数组、59.螺旋矩阵II

977. 有序数组的平方 - 力扣(LeetCode)

双指针法一次AC,主要思想为,从大往小保存然后倒序返回

class Solution:
    def sortedSquares(self, nums: List[int]) -> List[int]:
        if len(nums) == 0:
            return nums
        new_nums = []
        l = 0
        r = len(nums)-1
        while l <= r:
            if abs(nums[l]) >= abs(nums[r]):
                new_nums.append(nums[l]**2)
                l += 1
            else:
                new_nums.append(nums[r]**2)
                r -= 1
        return new_nums[::-1]

209. 长度最小的子数组 - 力扣(LeetCode)

大体知道要用滑动窗口去做,但是对于i和j如何更新没想清楚。
扫了下代码随想录的思路就开始写了,提交了几次才通过,遇到的坑有

  1. 边界条件的判断
  2. 需要对是否存在满足题意的子数组进行判断,因为min_len一开始是用的比较大的值
class Solution:
    def minSubArrayLen(self, target: int, nums: List[int]) -> int:
        _sum, i, j = 0, 0, 0
        min_len = len(nums) + 1

        # 左闭右闭
        for j in range(len(nums)):
            _sum += nums[j]
            if _sum < target:   # 需要继续移动j
                continue
            else:
                while _sum >= target and i <= j:    # 移动i到边界
                    min_len = min(min_len, j-i+1)
                    _sum -= nums[i]
                    i += 1
        
        if min_len <= len(nums):
            return min_len
        else:
            return 0

59. 螺旋矩阵 II - 力扣(LeetCode)

这题之前做过,当时一次AC,大体就是给n取几个特殊值观察一下规律,这次因为时间原因就不具体做了
大致扫了下代码随想录,关键点在于区间边界的明确,是左闭右开还是左闭右闭

总结

  1. 无穷大可以用float(‘inf’)
  2. 滑动窗口的更新需要重点复习

滑动窗口的更新一般涉及两个步骤:滑动和添加新数据。

滑动:滑动窗口的基本操作就是滑动,也就是向前移动一定的步长。通常,这涉及到将窗口中最早的数据移除。(一般涉及到循环,比如while)

添加新数据:滑动窗口滑动之后,需要用新数据填补窗口中的空缺。这通常涉及将新数据添加到窗口的末尾。

你可能感兴趣的:(算法)