题目地址(59. 螺旋矩阵 II)
https://leetcode-cn.com/problems/spiral-matrix-ii/
题目描述
给你一个正整数 n ,生成一个包含 1 到 n2 所有元素,且元素按顺时针顺序螺旋排列的 n x n 正方形矩阵 matrix 。示例 1:输入:n = 3输出:[[1,2,3],[8,9,4],[7,6,5]]示例 2:输入:n = 1输出:[[1]]提示:1 <= n <= 20
前置知识
公司
- 暂无
思路
一定要坚持循环不变量原则 不要上面4个 左边就变成了3个 再一次循环中让每次都一样
模拟顺时针画矩阵的过程:
- 填充上行从左到右
- 填充右列从上到下
- 填充下行从右到左
- 填充左列从下到上
由外向内一圈一圈这么画下去。
这里一圈下来,我们要画每四条边,这四条边怎么画,每画一条边都要坚持一致的左闭右开,或者左开又闭的原则,这样这一圈才能按照统一的规则画下来。
这里每一种颜色,代表一条边,我们遍历的长度,可以看出每一个拐角处的处理规则,拐角处让给新的一条边来继续画。
关键点
- 区间的判断
代码
- 语言支持:Java
Java Code:
class Solution {public int[][] generateMatrix(int n) {int[][] result = new int[n][n];//定义循环次数int loop = n/2;//定义每次循环开始的位置int startX = 0 , startY = 0;//定义偏移量 每次n-去偏移量 就是每次循环的次数int offset = 1;//定义填充的数字int count = 1;//定义中间数字 用于奇数n中间数字提取int mid = n/2;while (loop > 0) {int i = startX;int j = startY;//上侧左到右for (; j < startY+n-offset; j++) {result[startX][j] = count++;}//右侧上到下for (; i < startX+n-offset; i++) {result[i][j] = count++;}//下侧右到左for (; j > startY; j--) {result[i][j] = count++;}//左侧下到上for (; i > startX; i--) {result[i][j] = count++;}//循环次数--loop--;//偏移量+2offset += 2;startX +=1;startY +=1;}if (n%2==1){result[mid][mid] = count;}return result;}}
复杂度分析
令 n 为数组长度。
- 时间复杂度:
#card=math&code=O%28n%5E2%29&id=vrHRX)
- 空间复杂度:
#card=math&code=O%28n%29&id=HsxtO)
