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

977 有序数组的平方

题目:

代码随想录算法训练营第二天 | 977.有序数组的平方 、 209.长度最小的子数组 、59.螺旋矩阵II_第1张图片

链接:力扣

思路:

本题可以采用双指针的方法。由于数组是有序数组,且有正有负,则平方后的数字,最大的元素一定是在左右两边。此时可以考虑两边各设一个指针,往中间靠拢,将大的数字放入新的数组(从后往前放),当遍历完原数组之后,就可以得到一个新的平方后的有序数组了

代码

class Solution:
     def sortedSquares(self, nums: List[int]) -> List[int]:
         result=[]
         i=0
         j=len(nums)-1
         while i<=j:
             if nums[i]**2

 209.长度最小的子数组 

题目:

代码随想录算法训练营第二天 | 977.有序数组的平方 、 209.长度最小的子数组 、59.螺旋矩阵II_第2张图片

思路:

        这里的思路主要是采取滑动窗口(双指针)。在数组中,定义两个指针,分别指向起始位置,和终止位置,里面包含的元素就是加起来和大于输入的target的元素,当发现和大于target之后,缩小窗口,让起始位置向前移动,直到元素和小于target,此时终止位置向前移,扩大窗口,直到终止位置超出数组范围。在这个过程中,要不断记录每次符合标准的窗口大小,取最小值,等一遍遍历完之后,就可以得出最小的窗口大小值。

代码:

class Solution:
    def minSubArrayLen(self, target: int, nums: List[int]) -> int:
        res = float("inf")   # 定义一个无限大的数
        Sum = 0     # 滑动窗口数值之和
        i = 0      # 滑动窗口起始位置
        for j in range(len(nums)):
            Sum += nums[j] # 计算元素和
            while Sum >= target: # 进行窗口处理
                res = min(res, j-i+1) # 去
                Sum -= nums[i]
                i += 1
        return 0 if res == float("inf") else res

59.螺旋矩阵II

题目:力扣

代码随想录算法训练营第二天 | 977.有序数组的平方 、 209.长度最小的子数组 、59.螺旋矩阵II_第3张图片

 力扣

思路: 

这里一个非常重要的原则是循环不变量原则,因为涉及非常多的边界条件,所以一定要定下来一种规则(左闭右开或者左开右闭)不能改变,不然就会出错。在遵循左闭右开的基础上,分析规律:

  • 从左到右填充上行
  • 从上到下填充右行
  • 从右到做填充下行
  • 从下到上填充左行

在这个规律的基础上,逐步填充,当n为偶数时,直接填充,当n为奇数时,最后还要填充中心点


# @lc code=start
class Solution:
    def generateMatrix(self, n: int) -> List[List[int]]:
        nums = [[0] * n for _ in range(n)] #列表生成式,生成一个n*n的全0的二维列表
        startx, starty = 0, 0               # 起始点
        loop, mid = n // 2, n // 2          # 迭代次数、n为奇数时,矩阵的中心点
        count = 1                           # 计数

        for offset in range(1, loop + 1) :      # 每循环一层偏移量加1,偏移量从1开始
            for i in range(starty, n - offset) :    # 从左至右,左闭右开
                nums[startx][i] = count
                count += 1
            for i in range(startx, n - offset) :    # 从上至下
                nums[i][n - offset] = count
                count += 1
            for i in range(n - offset, starty, -1) : # 从右至左,步长为-1
                nums[n - offset][i] = count
                count += 1
            for i in range(n - offset, startx, -1) : # 从下至上
                nums[i][starty] = count
                count += 1                
            startx += 1         # 更新起始点
            starty += 1

        if n % 2 != 0 :			# n为奇数时,填充中心点
            nums[mid][mid] = count 
        return nums

你可能感兴趣的:(算法,矩阵,leetcode)