代码随想录第二天 977.有序数组的平方 209.长度最小的子数组 59.螺旋矩阵II

本文讨论了在解决LeetCode问题时如何运用双指针法、滑动窗口和理解循环不变量来优化算法,如在有序数组平方和长度最小子数组问题中降低循环次数。作者分享了通过设置双指针进行一次循环替代多次的经验和在螺旋矩阵II中的思考过程。
摘要由CSDN通过智能技术生成

 今日整体用时:2h

双指针法

核心逻辑:左侧开头设置指针,右侧结尾设置指针,双侧指针按照条件往中间移,指针碰到了就结束。

感想:需要两次循环的都可以想一想能不能通过设置双指针把两次循环变成一次循环。不管是快慢指针还是双指针,设置两次指针可以巧妙的在一次循环里指到两个位置从而降低循环次数。

题目链接:977. 有序数组的平方 - 力扣(LeetCode)

题目难度:简单

完成状态:一刷没做出来

完成时间:看完讲解5分钟做出来

此题目我出的问题:想到了双指针,但是一直在想用一个指针遍历完所有数据,另一个指针指向另一个数据,这样就造成题目解答一直是错的。也要想到可以两头同时往中间走,一个情况下左指针向中间走,另一个情况下右指针往中间走,最后两个指针相遇即停止。

滑动窗口

题目链接:209. 长度最小的子数组 - 力扣(LeetCode)

题目难度:中等

完成状态:一刷完成

完成时间:一刷15分钟做出来

 感想:涉及长度的都可以想一想滑动窗口。

螺旋数组

题目链接:59. 螺旋矩阵 II - 力扣(LeetCode)

题目难度:中等

完成状态:一刷没做出来

完成时间:看完讲解后20分钟做出来

没做出来的原因:不知道每一次循环的边界怎么写,边界怎么调整以及怎么算停止

感想:

循环不变量:(1)每次循环的时候形式尽可能一致

(2)每次循环的其实和终止规则设置尽可能一致

(3)每次循环结束,变量发生改变时,变化规则尽可能一致

循环的重点就是找起始位置、终止位置、循环方向和步长

class Solution:
    def generateMatrix(self, n: int) -> List[List[int]]:
        '''
        思路:
        1. 每一次的循环由四个遍历步骤组成,一共要循环n//2次,即转n//2圈
        2. 每一个遍历需要设置起始位置,终止位置
        3. 在找每一次转圈的操作时,要尽量保证每一次转圈操作规则一致;每一次转圈内部的4个遍历,也要尽可能保证设置起始位置、终止位置规则一致,起始位置和终止位置在每一次遍历或者转圈结束发生变化时,也要保证变化规则尽量一直(循环不变量)
        '''
        matrix=[[0]*n for i in range(n)]
        starti=0
        startj=0
        offset=1
        number=1
        for k in range(n//2):
            for j in range(startj,n-offset):
                matrix[starti][j]=number
                number+=1
            for i in range(starti,n-offset):
                matrix[i][n-offset]=number
                number+=1
            for j in range(n-offset,startj,-1):
                matrix[n-offset][j]=number
                number+=1
            for i in range(n-offset,starti,-1):
                matrix[i][startj]=number
                number+=1
            starti+=1
            startj+=1
            offset+=1
        if n%2 !=0:
            matrix[n//2][n//2]=number
        return matrix

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值