leetcode刷题记录——螺旋矩阵
——参考代码随想录和力扣顺序刷题(https://programmercarl.com/)
本质:模拟题目图示过程
59. 螺旋矩阵 II(中等)
给你一个正整数 n ,生成一个包含 1 到 n2 所有元素,且元素按顺时针顺序螺旋排列的 n x n 正方形矩阵 matrix 。
示例 1:

输入:n = 3
输出:[[1,2,3],[8,9,4],[7,6,5]]
示例 2:
输入:n = 1
输出:[[1]]
思路:
- 确定不变量:分四次循环;每次循环都是左闭右开(int j=l;j<r;j++)右边取小于号;
- 用一个count来进行计数;
- 注意n*n(n为奇数)的时候中间的需要额外补充(循环少一次)
代码:
class Solution {
public:
vector<vector<int>> generateMatrix(int n) {
int l=0,r=n-1,t=0,b=n-1;
//统一左闭右开
int count = 1;
vector<vector<int>> matrix(n,vector<int>(n));
for(int i=0;i<n/2;i++) {
//从左到右
for(int j=l;j<r;j++) {
matrix[l][j] = count++;
}
//从上到下
for(int k=t;k<b;k++) {
matrix[k][r] = count++;
}
//从右到左
for(int j=r;j>l;j--) {
matrix[b][j] = count++;
}
//从下到上
for(int k=b;k>t;k--) {
matrix[k][l] = count++;
}
l = l + 1;
t = t + 1;
r = r - 1;
b = b - 1;
}
if(n%2 != 0) {
matrix[n/2][n/2] = n*n;
}
return matrix;
}
};
54. 螺旋矩阵(中等)
给你一个 m 行 n 列的矩阵 matrix ,请按照 顺时针螺旋顺序 ,返回矩阵中的所有元素。

示例1:
输入:matrix = [[1,2,3],[4,5,6],[7,8,9]]
输出:[1,2,3,6,9,8,7,4,5]
思路:
- 本质和59一样;进行题目模拟;
- 但是会出现m和n不相等的情况,就会出现反复(多次)插入同一元素的情况;因此需要count计数;
- if(count > m*n) break;
- 最后再对n*n的进行单独处理;
代码:
class Solution {
public:
vector<int> spiralOrder(vector<vector<int>>& matrix) {
int n = matrix.size();
int m = matrix[0].size();
vector<int> res;
int l=0,r=m-1,t=0,b=n-1;
//统一左闭右开
int count = 1;
for(int i=0;i<max(m,n)/2;i++) {
//从左到右
for(int j=l;j<r;j++) {
if(count > m*n) break;
res.push_back(matrix[l][j]);
count++;
}
//从上到下
for(int k=t;k<b;k++) {
if(count > m*n) break;
res.push_back(matrix[k][r]);
count++;
}
//从右到左
for(int j=r;j>l;j--) {
if(count > m*n) break;
res.push_back(matrix[b][j]);
count++;
}
//从下到上
for(int k=b;k>t;k--) {
if(count > m*n) break;
res.push_back(matrix[k][l]);
count++;
}
l = l + 1;
t = t + 1;
r = r - 1;
b = b - 1;
}
if(n%2 != 0 && m%2 != 0 && m == n) {
res.push_back(matrix[n/2][n/2]);
}
return res;
}
};
剑指 Offer 29. 顺时针打印矩阵(简单)
思路:
和上题代码一样;
多了空数组判断
if (matrix.size() == 0 || matrix[0].size() == 0) { return {}; }
版权声明:本文为GZW18620285024原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。