秋招算法备战第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)

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值