题目地址(59. 螺旋矩阵 II)

https://leetcode-cn.com/problems/spiral-matrix-ii/

题目描述

  1. 给你一个正整数 n ,生成一个包含 1 n2 所有元素,且元素按顺时针顺序螺旋排列的 n x n 正方形矩阵 matrix
  2. 示例 1
  3. 输入:n = 3
  4. 输出:[[1,2,3],[8,9,4],[7,6,5]]
  5. 示例 2
  6. 输入:n = 1
  7. 输出:[[1]]
  8. 提示:
  9. 1 <= n <= 20

前置知识


公司

  • 暂无

思路

一定要坚持循环不变量原则 不要上面4个 左边就变成了3个 再一次循环中让每次都一样
image.png
模拟顺时针画矩阵的过程:

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

由外向内一圈一圈这么画下去。
这里一圈下来,我们要画每四条边,这四条边怎么画,每画一条边都要坚持一致的左闭右开,或者左开又闭的原则,这样这一圈才能按照统一的规则画下来。
这里每一种颜色,代表一条边,我们遍历的长度,可以看出每一个拐角处的处理规则,拐角处让给新的一条边来继续画。

关键点

  • 区间的判断

代码

  • 语言支持:Java

Java Code:

  1. class Solution {
  2. public int[][] generateMatrix(int n) {
  3. int[][] result = new int[n][n];
  4. //定义循环次数
  5. int loop = n/2;
  6. //定义每次循环开始的位置
  7. int startX = 0 , startY = 0;
  8. //定义偏移量 每次n-去偏移量 就是每次循环的次数
  9. int offset = 1;
  10. //定义填充的数字
  11. int count = 1;
  12. //定义中间数字 用于奇数n中间数字提取
  13. int mid = n/2;
  14. while (loop > 0) {
  15. int i = startX;
  16. int j = startY;
  17. //上侧左到右
  18. for (; j < startY+n-offset; j++) {
  19. result[startX][j] = count++;
  20. }
  21. //右侧上到下
  22. for (; i < startX+n-offset; i++) {
  23. result[i][j] = count++;
  24. }
  25. //下侧右到左
  26. for (; j > startY; j--) {
  27. result[i][j] = count++;
  28. }
  29. //左侧下到上
  30. for (; i > startX; i--) {
  31. result[i][j] = count++;
  32. }
  33. //循环次数--
  34. loop--;
  35. //偏移量+2
  36. offset += 2;
  37. startX +=1;
  38. startY +=1;
  39. }
  40. if (n%2==1){
  41. result[mid][mid] = count;
  42. }
  43. return result;
  44. }
  45. }

复杂度分析

令 n 为数组长度。

  • 时间复杂度:59. 螺旋矩阵 II - 图2#card=math&code=O%28n%5E2%29&id=vrHRX)
  • 空间复杂度:59. 螺旋矩阵 II - 图3#card=math&code=O%28n%29&id=HsxtO)