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


Leetcode977.有序数组的平方

相向双指针

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

Leetcode209.长度最小的子数组

快慢指针,或者叫滑动窗口,每次for循环都在寻找以快指针指向元素为最后一个元素的符合条件的长度最小的子数组,精髓在于当进入下一个for循环时,慢指针不用回退,因此快慢指针最多各移动n次,n为数组长度,时间复杂度为O(n)。

class Solution:
    def minSubArrayLen(self, target: int, nums: List[int]) -> int:
        slow = 0
        sum = 0
        length = float("inf")
        for fast in range(0, len(nums)):
            sum += nums[fast]
            while sum >= target:
                length = min(length, fast - slow + 1)
                sum -= nums[slow]
                slow += 1 
        return 0 if length == float("inf") else length

Leetcode59. 螺旋矩阵 II

这条题目自己尝试了很久也没有调对,一开始是在循环不变量边界条件上卡了蛮久时间,后来把边界条件调对以后结果还是不对,并且发现输出的二维数组里每一行都是一样的,后来才发现是二维数组的初始化方式搞错了,一开始初始化写的是m = [[0]*n]*n,后来自己测试了一下才知道这种初始化方式里更改其中一行的值会导致每行的值都被更改,具体的例子可以见这个链接:Python如何创建二维数组和初始化。把初始化方式改成m = [[0]*n for i in range(n)]后就对了。

class Solution:
    def generateMatrix(self, n: int) -> List[List[int]]:
        l = n -1
        number = 1
        m = [[0]*n for i in range(n)]
        startx = 0
        starty = 0
        while l > 0:

            for j in range(starty, l):
                m[startx][j] = number
                number += 1
           
            for i in range(startx, l):
                m[i][j+1] = number
                number += 1
         
            for j in range(l, starty, -1):
                m[i+1][j] = number
                number += 1
            
            for i in range(l, startx, -1):
                m[i][starty] = number
                number += 1

            l -= 1
            startx += 1
            starty += 1

        if n%2 == 1:
            m[n//2][n//2]  = n*n

        return m
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值