螺旋矩阵2

这篇博客介绍了一个Python算法,用于生成一个n×n的螺旋矩阵,矩阵中的元素从1开始,按照顺时针方向螺旋排列。算法通过设定起始点并按圈层填充,特别处理了奇数情况下中间元素的填充。代码中使用了for循环和range函数,并强调了它们在迭代过程中的行为与while循环的不同。

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

  • 设置起始点为(x, y)每转一圈就更新起始点。
  • 一共要转loop = n // 2次。
  • 采用左闭右开的原则
  • n为奇数时,需要加上中间那个数。
class Solution:
    def generateMatrix(self, n: int) -> List[List[int]]:
        matrix=[[0] * n for _ in range(n)]
        count=1
        x = y = 0 #作为起始点
        loop = n // 2 # 用于记录循环次数,也就是需要转多少圈
        for cir in range(loop):
            for j in range(y, n - cir - 1):
                matrix[x][j] = count
                count += 1
            for i in range(x, n - cir -1):
                matrix[i][n - cir - 1] = count
                count += 1
            for j in range(n - cir - 1, y, -1):
                matrix[n - cir - 1][j] = count
                count += 1
            for i in range(n - cir - 1, x, -1):
                matrix[i][x] = count
                count += 1
            x += 1
            y += 1 
        #如果n为奇数,需要填中间那个格子
        if (n % 2 != 0):
            matrix[loop][loop] = count
        return matrix

细节:

  1. 不要忘记range的那个-1
  2. forrange的组合不会让遍历元素加一或减一,而while会。
for i in range(0,2):
    pass
print(i) #1

i = 0
while i < 2:
    i += 1
print(i) #2
### Java 螺旋矩阵2 的递归实现 螺旋矩阵2 是指给定一个正整数 `n`,返回一个包含从 1 到 n&sup2; 所有元素的按顺时针顺序排列的 n×n 矩阵。以下是基于递归方法的一种解决方案。 #### 方法概述 为了构建螺旋矩阵,可以采用分层填充的方式。每一层表示矩阵的一个环形边界。通过递归处理外层到内层的过程,逐步完成整个矩阵的填充[^1]。 #### 实现代码 以下是一个完整的 Java 实现: ```java public class SpiralMatrixII { public static int[][] generateMatrix(int n) { int[][] result = new int[n][n]; fillMatrix(result, 0, n - 1, 1); return result; } private static void fillMatrix(int[][] matrix, int start, int end, int num) { if (start > end) { // 基本条件判断 return; } // 上边:从左到右 for (int i = start; i <= end; i++) { matrix[start][i] = num++; } // 右边:从上到下 for (int i = start + 1; i <= end; i++) { matrix[i][end] = num++; } // 下边:从右到左(仅当不是单行) if (start != end) { for (int i = end - 1; i >= start; i--) { matrix[end][i] = num++; } } // 左边:从下到上(仅当不是单列) if (start != end) { for (int i = end - 1; i > start; i--) { matrix[i][start] = num++; } } // 处理内部子矩阵 fillMatrix(matrix, start + 1, end - 1, num); // 进入更深层次 } public static void main(String[] args) { int n = 4; int[][] spiralMatrix = generateMatrix(n); // 输出结果 for (int i = 0; i < spiralMatrix.length; i++) { for (int j = 0; j < spiralMatrix[0].length; j++) { System.out.print(spiralMatrix[i][j] + "\t"); } System.out.println(); } } } ``` #### 关键点解析 1. **递归终止条件** 当前层的起始索引 (`start`) 小于等于结束索引 (`end`) 时继续执行;否则退出递归[^3]。 2. **逐层填充逻辑** 每一层按照 “上 → 右 → 下 → 左” 的顺序依次填充值。对于最内层可能是单独的一行或一列的情况进行了特殊处理。 3. **参数传递优化** 使用两个变量 `start` 和 `end` 来定义当前层的范围,并随着递归调用逐渐缩小范围直到覆盖所有层次[^2]。 #### 时间复杂度分析 该算法的时间复杂度为 O(n&sup2;),因为需要遍历并填充矩阵中的每一个位置。 --- ###
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值