代码随想录训练营的第二天(Python)| 977.有序数组的平方、209.长度最小的子数组、59.螺旋矩阵II

977.有序数组的平方

暴力求解(O(n+logn))
class Solution:
    def sortedSquares(self, nums: List[int]) -> List[int]:
        return sorted(i**2 for i in nums)
双指针(O(n))

由于列表是单调递增的,元素平方后的最大值要么在最前面,要么在最后面

class Solution:
    def sortedSquares(self, nums: List[int]) -> List[int]:
        l, r = 0, len(nums) - 1
        res = [float('inf')]*len(nums)
        i = len(nums) - 1    # 从列表最后面开始赋值
        while l <= r:
            if nums[l]**2 < nums[r]**2: # 比较左右指针指向的值,谁最大就选谁赋值
                res[i] = nums[r]**2
                r -= 1
            else:
                res[i] = nums[l]**2
                l += 1
            i -= 1
        return res

209.长度最小的子数组

暴力解法
class Solution:
    def minSubArrayLen(self, target: int, nums: List[int]) -> int:
        n = len(nums)
        min_len = float('inf')
        for i in range(n):
            sum_val = 0
            for j in range(i, n):
                sum_val += nums[j]
                if sum_val >= target:
                    sub_len = j-i+1
                    min_len = min(min_len, sub_len)
                    break
        return min_len if min_len != float('inf') else 0
滑动窗口

什么时候缩小窗口

class Solution:
    def minSubArrayLen(self, target: int, nums: List[int]) -> int:
        n = len(nums)
        s, e = 0, 0
        min_len = float('inf')
        sum_val = 0
        while e < n:
            sum_val += nums[e]
            while sum_val >= target: # 缩小窗口, 这里 为什么不为 if ,因为开始指针向右移动一个位后,还有可能 sum_val >= target
                min_len = min(min_len, e-s+1)
                sum_val -= nums[s]
                s += 1
            e += 1
        return min_len if min_len != float('inf') else 0

59.螺旋矩阵II
注意点: 使用左闭右开区间。遍历的偏移量和方向,迭代的次数。

class Solution:
    def generateMatrix(self, n: int) -> List[List[int]]:
        res = [[0]*n for _ in range(n)] # 初始化矩阵
        startx = starty = 0 # 开始位置
        loop, mid = n // 2, n // 2 # loop 是为迭代次数,n 为奇数时 mid 为中心
        count = 1 # 用计数
        for offset in range(1, loop+1): # offset 为偏移量,从 1 开始
            for j in range(startx, n-offset): # 从左到右
                res[startx][j] = count
                count += 1
            for i in range(starty, n-offset): # 从上到下
                res[i][n-offset] = count
                count += 1
            for k in range(n-offset, startx, -1): # 从右到左
                res[n-offset][k] = count
                count += 1
            for l in range(n-offset, starty, -1): # 从下到上
                res[l][starty] = count
                count += 1
            startx += 1   # 更新开始位置
            starty += 1
        if n % 2 == 1:    # 填充矩阵中心
            res[mid][mid] = count
        return res
posted @   忆象峰飞  阅读(10)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· DeepSeek “源神”启动!「GitHub 热点速览」
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· 我与微信审核的“相爱相杀”看个人小程序副业
· C# 集成 DeepSeek 模型实现 AI 私有化(本地部署与 API 调用教程)
· spring官宣接入deepseek,真的太香了~
点击右上角即可分享
微信分享提示