leetcode 59.螺旋矩阵

题目

59.螺旋矩阵
给你一个正整数 n ,生成一个包含 1 到 n2 所有元素,且元素按顺时针顺序螺旋排列的 n x n 正方形矩阵 matrix 。

解题思路

构建一个n行n列的二维数组
计算转几圈(注意n为奇数时,转圈结束后会剩余一个中心点)
填充每圈的数值 --最外层循环
每圈按四条边进行赋值,从左到右、从上到下、从右到左、从下到上 --在外侧循环内套四个循环,一条边用一个循环
关键点:所有循环的边界点 统一使用 左闭右开

实现代码

from typing import List

class Solution:
    def generateMatrix(self, n: int) -> List[List[int]]:
        # 构建一个n行n列的二维数组
        nums = [[0] * n for _ in range(n)]

        # 定义矩阵的起始点  --起始位置每一圈都会变化,所以要用变量定义起始位置
        startx, starty = 0, 0
        # 定义循环次数
        loop = n // 2
        # 如果n是奇数,循环后会剩余一个中心点  
        # 比如n=3,转一圈后剩余中心点nums[1,1]; n=5 中心点nums[2,2]
        # 当n是奇数时,转loop圈后剩余中心点nums[mid, mid]要单独赋值
        mid = n // 2
        if n %2 == 1:
            nums[mid][mid] = n ** 2
        
        # 每循环一圈,起始点就会偏移,偏移量从1开始 
        # 不转圈和转1圈时,起始点都不偏移,转2圈时起始点从[0,0]偏移为[1,1]
        '''
        n = 1, loop = 0, startx, starty = 0,0
        n = 2, loop = 1, startx, starty = 0,0
        n = 3, loop = 1, startx, starty = 0,0
        n = 4, loop = 2, 第一圈 startx, starty = 0,0 第二圈 startx, starty = 1,1  
        '''
        value = 1 
        for offset in range(1, loop + 1):   # 起始点的偏移量从1开始     
            '''
            假设n = 4, loop = 2, for offset in range(1,3) --offset的值为1,2
            for i in range(0,3)     i=0,1,2 
            循环第一圈            
            从左到右,左闭右开
            startx, starty = 0, 0
            value = 1
            i = 0, nums[0][0] = 1 
            value = 2
            i = 1, nums[0][1] = 2
            value = 3
            i = 2, nums[0][2] = 3
            
            从上到下
            从右到左
            从下到上

            循环第二圈
            startx, starty = 1, 1
            ......

            '''
            for i in range(starty, n - offset): # 从左到右   nums[0][0]、nums[0][1]、nums[0][2]  
                nums[startx][i] = value
                value += 1
            for i in range(startx, n - offset):   # 从上到下  nums[0][3]、nums[1][3]、nums[2][3]
                nums[i][n - offset] = value
                value += 1
            for i in range(n - offset, starty, -1):   # 从右到左  nums[3][3]、nums[3][2]、nums[3][1]
                nums[n - offset][i] = value
                value += 1
            for i in range(n - offset, startx, -1):   # 从下到上  nums[3][0]、nums[2][0]、nums[1][0]
                nums[i][startx] = value
                value += 1
            startx += 1
            starty += 1
        
        return nums
        
test = Solution()
print(test.generateMatrix(4))  # [[1, 2, 3, 4], [12, 13, 14, 5], [11, 16, 15, 6], [10, 9, 8, 7]]

本题涉及的python基础知识

# 1、构造二维矩阵  使用列生成表达式 list = [表达式 for 变量 in 范围 if 条件]
n = 3
arr = [[0] * n for _ in range(n)]
# [0] * n 表示数组重复n次并依次连接形成一个新数组
# for _ in range(n) 等效于for i in range(n)  将循环运行n次  _在后面不会用到,是个占位符
print(arr)  # [[0, 0, 0], [0, 0, 0], [0, 0, 0]]

# 创建一个3行4列数组
nums = [[0] * 4 for _ in range(3)] 
# 给指定行和列给单个元素赋值  给第一行的4个列分别赋值
nums[0][0] = 1
nums[0][1] = 2
nums[0][2] = 3
nums[0][3] = 4
print(nums) # [[1, 2, 3, 4], [0, 0, 0, 0], [0, 0, 0, 0]]

# 整行赋值
nums[0] = [1,2,3,4]
nums[1] = [5,6,7,8]
nums[2] = [9,10,11]
print(nums)

# 2、倒序取值
for i in range(4, 0, -1):
    print(i)    # 4 3 2 1 

posted on 2024-04-06 16:26  小鹿BAMBI  阅读(3)  评论(0编辑  收藏  举报