力扣算法打卡第二天(数组) | 977. 有序数组的平方、209. 长度最小的子数组、59. 螺旋矩阵 II

977.有序数组的平方

题目链接:力扣977
思路:双指针

因为数组有序,且存在负数,所以数组元素平方后的最大元素一定在两边,大小会从两边向内递减,所以左右指针指向数组左右边界,向内遍历。

完整代码:

class Solution:
    def sortedSquares(self, nums: List[int]) -> List[int]:
        left, right = 0, len(nums) - 1
        index = len(nums) - 1
        res = [-1] * len(nums)

        while left <= right:
            if pow(nums[left], 2) > pow(nums[right], 2):
                res[index] = pow(nums[left], 2)
                left += 1
            else:
                res[index] = pow(nums[right], 2)
                right -= 1 
            index -= 1
        return res

209. 长度最小的子数组

题目链接:力扣209
思路:滑动窗口(双指针)

使用右指针遍历数组,当sum满足条件时移动左指针,尝试缩小子数组大小,用res记录目前所有符合条件的子数组里最小的数组

class Solution:
    def minSubArrayLen(self, target: int, nums: List[int]) -> int:
        res = float("INF")  # 正无穷,res存放目前搜索到的子序列中最小的符合条件的长度
        sum = 0  # 当前窗口内元素和
        left, right = 0, 0 
        for right in range(len(nums)):
            sum += nums[right]
            while sum >= target:
                subl = right - left + 1  # 当前窗口长度
                res = min(res, subl)
                sum -= nums[left]
                left += 1
                
        if res < float("INF"):
            return res
        else:
             return 0

59. 螺旋矩阵

题目链接:力扣59
思路:模拟

注意循环不变量,也就是注意边界点交给那条边处理
遍历方式:如图(图片源自代码随想录网站),最后一个点交给下一条边处理
图源自代码随想录

n-offset为每次循环圈里的边界值数组下标,到下一圈时加1

class Solution:
    def generateMatrix(self, n: int) -> List[List[int]]:
        res = [[0] * n for _ in range(n)]
        cnt = 1  # 需要填入的数
        round = n//2  # 需要遍历的圈数
        startx, starty = 0, 0  # 当前遍历圈起始的横纵坐标
        offset = 1  # 控制上下左右每条边遍历的长度,每次循环加1
        while round > 0:
            for j in range(starty, n - offset):
                res[startx][j] = cnt
                cnt += 1
            for i in range(startx, n-offset):
                res[i][n - offset] = cnt
                cnt += 1
            for j in range(n - offset, starty, -1):
                res[n - offset][j] = cnt
                cnt += 1
            for i in range(n - offset, startx, -1):
                res[i][starty] = cnt
                cnt += 1
            startx += 1
            starty += 1
            offset += 1
            round -= 1
        if n%2 == 1: #  因为round是整除的n,所以n为奇数时,中心点需要额外处理
            res[n//2][n//2] = cnt
        return res 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值