螺旋矩阵II
- 按照自己思路来就ok,逻辑理清楚就行
例题如下
59.螺旋矩阵II
给你一个正整数 n
,生成一个包含 1
到 n2
所有元素,且元素按顺时针顺序螺旋排列的 n x n
正方形矩阵 matrix
。
1.自己搞了一遍
class Solution {
public:
vector<vector<int>> generateMatrix(int n) {
vector<vector<int>> result(n, vector<int>(n, 0));
int num = 1;
for(int i = 0;i < n;i++){
for(int j = i;j < n - i;j++){//上侧,从左到右,左闭右闭
if(result[i][j] == 0) result[i][j] = num++;
else break;
}
for(int k = i + 1;k < n - i;k++){//右侧,从上到下,上开下闭
if(result[k][n - 1 - i] == 0) result[k][n - 1 - i] = num++;
else break;
}
for(int l = n - i - 2;l >= i;l--){//下侧,从右到左,右开左闭
if(result[n - i - 1][l] == 0) result[n - i - 1][l] = num++;
else break;
}
for(int m = n - i - 2; m > i; m--){//左侧,从下到上,下开上开
if(result[m][i] == 0) result[m][i] = num++;
else break;
}
}
return result;
}
};
2.改一下,看的舒服一些,但是运行速度变长了,储存空间也变大了
class Solution {
public:
vector<vector<int>> generateMatrix(int n) {
vector<vector<int>> result(n, vector<int>(n, 0));
int num = 1;
for(int i = 0;i < n;i++){
for(int j = i;j < n - i - 1;j++){//上侧,从左到右,左闭右开
if(result[i][j] == 0) result[i][j] = num++;
else break;
}
for(int k = i;k < n - i - 1;k++){//右侧,从上到下,上闭下开
if(result[k][n - i - 1] == 0) result[k][n - i - 1] = num++;
else break;
}
for(int l = n - i - 1;l > i;l--){//下侧,从右到左,右闭左开
if(result[n - i - 1][l] == 0) result[n - i - 1][l] = num++;
else break;
}
for(int m = n - i - 1; m > i ; m--){//左侧,从下到上,下闭上开
if(result[m][i] == 0) result[m][i] = num++;
else break;
}
}
if(result[n / 2][n / 2] == 0) result[n / 2][n / 2] = num++;
return result;
}
};
3.看到一个非常优雅的代码,leetcode一个评论中
class Solution {
public:
vector<vector<int>> generateMatrix(int n) {
int t = 0; // top
int b = n-1; // bottom
int l = 0; // left
int r = n-1; // right
vector<vector<int>> ans(n,vector<int>(n));
int k=1;
while(k<=n*n){
for(int i=l;i<=r;++i,++k) ans[t][i] = k;
++t;
for(int i=t;i<=b;++i,++k) ans[i][r] = k;
--r;
for(int i=r;i>=l;--i,++k) ans[b][i] = k;
--b;
for(int i=b;i>=t;--i,++k) ans[i][l] = k;
++l;
}
return ans;
}
};
54.螺旋矩阵
给你一个 m
行 n
列的矩阵 matrix
,请按照 顺时针螺旋顺序 ,返回矩阵中的所有元素。
class Solution {
public:
vector<int> spiralOrder(vector<vector<int>>& matrix) {
int num = 0;
int m = matrix.size();
int n = matrix[0].size();
vector<int> result(m * n);
for(int i = 0;i < m; i++){
for(int j = i;j < n - i;j++){
if(num == m * n)break;
else result[num++] = matrix[i][j];
}
for(int k = i + 1;k < m - i;k++){
if(num == m * n)break;
result[num++] = matrix[k][n - i - 1];
}
for(int l = n - i - 2;l >= i;l--){
if(num == m * n)break;
result[num++] = matrix[m - i - 1][l];
}
for(int z = m - i - 2;z > i;z--){
if(num == m * n)break;
result[num++] = matrix[z][i];
}
}
return result;
}
};
剑指 Offer 29. 顺时针打印矩阵
输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字。
跟54题一样,但是多了可能会出现空数组
class Solution {
public:
vector<int> spiralOrder(vector<vector<int>>& matrix) {
if (matrix.size() == 0 || matrix[0].size() == 0) return {};//多了个空数组判定
int num = 0;
int m = matrix.size();
int n = matrix[0].size();
vector<int> result(m * n);
for(int i = 0;i < m; i++){
for(int j = i;j < n - i;j++){
if(num == m * n)break;
else result[num++] = matrix[i][j];
}
for(int k = i + 1;k < m - i;k++){
if(num == m * n)break;
result[num++] = matrix[k][n - i - 1];
}
for(int l = n - i - 2;l >= i;l--){
if(num == m * n)break;
result[num++] = matrix[m - i - 1][l];
}
for(int z = m - i - 2;z > i;z--){
if(num == m * n)break;
result[num++] = matrix[z][i];
}
}
return result;
}
};