算法训练营

本文介绍了如何使用双指针方法解决三个编程问题:有序数组的平方、长度最小的子数组和螺旋矩阵II。涉及到了时间复杂度分析和空间复杂度控制,展示了在不同场景下的代码实现和优化策略。
摘要由CSDN通过智能技术生成

代码随想录算法训练营|977.有序数组的平方; 209.长度最小的子数组; 59.螺旋矩阵II

977.有序数组的平方

题目链接: 977.有序数组的平方
文档讲解: 代码随想录
视频讲解: B站代码随想录
题目难度:简单

思路:考虑双指针的思想。左指针和右指针分别从两边开始遍历,大的值放在新数组最后面。
时间复杂度:O(log(n));空间复杂度:O(n)
下面展示 代码

class Solution:
    def sortedSquares(self, nums: List[int]) -> List[int]:
        left = 0
        right = len(nums) - 1
        res = [0] * len(nums)
        for k in range(len(nums), 0, -1):
            if nums[left]**2 < nums[right]**2:
                # 右边的平方大,右指针-1,左指针不变
                res[k-1] = nums[right]**2
                right -= 1
            else:
                # 左边的平方大,左指针+1,右指针不变
                res[k-1] = nums[left]**2
                left += 1
        return res

209.长度最小的子数组

题目链接: 209.长度最小的子数组
文档讲解: 代码随想录
视频讲解: B站代码随想录
题目难度:中等
思路:双指针法(滑动窗口): 左指针和右指针组成滑动窗口,每次满足窗口的和满足要求(大于等于target)时,记录窗口长度,找到最小的窗口
时间复杂度:O(n);空间复杂度:O(1)
代码如下

class Solution:
    def minSubArrayLen(self, target: int, nums: List[int]) -> int:
        left, right = 0, 0
        length = len(nums)
        res = float('Inf')
        summ = 0
        while right < length:
            summ += nums[right]

            while summ >= target:
                res = min(res, right - left + 1)
                summ -= nums[left]
                left += 1
            
            right += 1
        
        return res if res != float('Inf') else 0

59.螺旋矩阵II

题目链接: 59.螺旋矩阵II
文档讲解: 代码随想录
视频讲解: B站代码随想录
题目难度:中等
思路:注意区间,如果选择左开右闭就一直保持左开右闭
模拟顺时针画矩阵的过程:
填充上行从左到右
填充右列从上到下
填充下行从右到左
填充左列从下到上
时间复杂度:O(n^2)
acm模式代码如下

# 输入输出版
def generateMatrix(n: int):
    # 利用二分法的左闭右开进行矩阵填充
    res = [[0]*n for i in range(n)]

    loop = n // 2
    count = 1
    start = 0
    for circle in range(1, loop + 1):
        # 从左到右,左闭右开
        for i in range(start, n - circle):
            res[start][i] = count
            count += 1
        # 从上到下,左闭右开
        for i in range(start, n - circle):
            res[i][n-circle] = count
            count += 1
        # 从右到左,左闭右开
        for i in range(n - circle, start, -1):
            res[n-circle][i] = count
            count += 1
        # 从下到上,左闭右开
        for i in range(n - circle, start, -1):
            res[i][start] = count
            count += 1
        
        # loop结束
        start += 1
    if n % 2 == 0:
        print(res) 
    else:
        res[n//2][n//2] = count
        print(res)

n = int(input())
generateMatrix(n)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值