【LeetCode刷题记录4】数组——螺旋矩阵

螺旋矩阵

59. 螺旋矩阵II

在这里插入图片描述

# 方法一
class Solution(object):
    def generateMatrix(self, n):
        """
        :type n: int
        :rtype: List[List[int]]
        """
        NMatrix = [[0 for i in range(n)] for j in range(n)]
        nums = [i for i in range(1, n**2 + 1)]
        l = (n - 1)//2 + 1   # 计算圈数 

        for i in range(l):
            for j in range(n-i*2):     # 计算圈的上侧填充数组
                NMatrix[i][i+j] = nums[0]
                nums.pop(0)
                
            for j in range(n-2*i-1):
                NMatrix[i+j+1][n-i-1] = nums[0]   # 计算圈的右侧填充数组
                nums.pop(0)
                
            for j in range(n-2*i-1):
                print(i,j)
                NMatrix[n-i-1][n-j-i-2] = nums[0]  # 计算圈的下侧填充数组
                nums.pop(0)
                
            for j in range(n-i*2-2):
                NMatrix[n-j-i-2][i] = nums[0]  # 计算圈的左侧填充数组
                nums.pop(0)
                
        return NMatrix
# 方法二
class Solution:
def generateMatrix(self, n: int) -> List[List[int]]:
    nums = [[0] * n for _ in range(n)]
    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) : # 从右至左
            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

备注: 方法一中要注意的是 每一圈的每一层,他一共需要填充多少个数(多少个j),每次填充的下标如何通过i,n,j来表示,比较麻烦。方法二对其进行的优化,使得下标都可以通过固定的规律来表示

54. 螺旋矩阵

在这里插入图片描述

class Solution(object):
    def spiralOrder(self, matrix):
        """
        :type matrix: List[List[int]]
        :rtype: List[int]
        """
        h , l = len(matrix), len(matrix[0])
        nums = []
        c = 0  # 定义圈数

        while len(nums) < h * l:

            for k in range(l-2*c):
                nums.append(matrix[c][k+c])

            if h-2*c-1 == 0:
                break
            for k in range(h-2*c-1):
                nums.append(matrix[c+k+1][l-c-1])

            if l-2*c-1 == 0:
                break
            for k in range(l-2*c-1):
                nums.append(matrix[h-1-c][l-k-c-2])

            for k in range(h-2*c-2):
                nums.append(matrix[h-2-c-k][c])

            c += 1

        return nums

备注: 我做这个题目就是先确定好圈,确定每圈的每一条边的指针的起始点以及移动次数,然后通过while不断缩小圈

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值