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

本文介绍了Python编程中的四个练习题:有序数组的平方优化算法、长度最小子数组问题、滑动窗口技巧以及螺旋矩阵生成。作者通过实例展示了如何使用双指针和循环不变量原则解决这些问题。
摘要由CSDN通过智能技术生成

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


前言

如题目所示,简单记录

今日练习

977. 有序数组的平方

一开始想着暴力,但太麻烦了,后来想用双指针,写出来了三方交换,也很奇怪。观看视频后,新的数组设立了一个新空间,而不是在原来基础上存放。

代码

class Solution:
    def sortedSquares(self, nums: List[int]) -> List[int]:
        for i in range(len(nums)):
            nums[i] = nums[i] * nums[i]

        renum = [0]*len(nums)   #存放目标数组
		k = len(nums) - 1
		
        left = 0
        right = len(nums) - 1

        while left <= right:  #如果没有等于会丢掉最后相等时的数

            if nums[left] > nums[right]:
                renum[k] = nums[left]
                k= k - 1
                left = left + 1   #左边取完,向中间走一步
            else:
                renum[k] = nums[right]
                k= k - 1
                right = right - 1
        return renum

有序数组的平方:有序数组两边的平方值大,设置双指针从左右往中间聚,就可以得到从大到小排序的数组,再将数组倒序排列(k从len(nums)——>0)。

209. 长度最小的子数组

代码

class Solution:
    def minSubArrayLen(self, target: int, nums: List[int]) -> int:
        left = 0
        right = 0

        sum = 0
        min_len = float('inf')

        while right < len(nums):
            sum = sum + nums[right]
            while sum >= target:
                sum = sum - nums[left]
                min_len = min(min_len,right-left+1)

                left = left + 1  #其他操作完成后再向右移动
            right = right + 1

        if min_len != float('inf'):
            return min_len
        else:
            return 0

滑动窗口

滑动窗口:就是不断的调节子序列的起始位置和终止位置,从而得出我们要想的结果。

i从首项开始,下标j向后移动,直到窗口内的和>sum,至此确定j的位置;然后不断向后移动i的位置,知道窗口长度最小。
在这里插入图片描述

59. 螺旋矩阵 II

代码

class Solution:
    def generateMatrix(self, n: int) -> List[List[int]]:
        nums = [[0]*n for _ in range(n)]  #快速生成n个长度为n的数组
        startx = 0
        starty = 0
        count = 1

        #左闭右开,每条边只处理左端点
        #i行j列

        for k in range(1,n//2+1):  #k为每圈的深度
            for i in range(starty,n-k):#横着(),改变j
                nums[startx][i] = count
                count += 1

            for i in range(startx,n-k):#竖着(),改变j
                nums[i][n-k] = count
                count += 1

            for i in range(n-k,starty,-1):#横着(),改变j
                nums[n-k][i] = count
                count += 1

            for i in range(n-k,startx,-1):#竖着(),改变j
                nums[i][starty] = count
                count += 1

            startx += 1
            starty += 1
            

        if n % 2 ==1:
            nums[n//2][n//2] = count

        return nums

循环不变量原则

模拟顺时针画矩阵的过程:

填充上行从左到右
填充右列从上到下
填充下行从右到左
填充左列从下到上
由外向内一圈一圈这么画下去。

每画一条边都要坚持一致的左闭右开,或者左开右闭的原则,这样这一圈才能按照统一的规则画下来

左闭右开的原则,画一圈:
在这里插入图片描述

总结

  1. 滑动窗口
  2. 循环不变量原则
    在这里插入图片描述
  • 10
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值