题目54:Spiral Matrix
Given a matrix of m x n elements (m rows, n columns), return all elements of the matrix in spiral order.
例子:
For example,
Given the following matrix:
[
[ 1, 2, 3 ],
[ 4, 5, 6 ],
[ 7, 8, 9 ]
]
You should return [1,2,3,6,9,8,7,4,5].
问题解析:
给定m*n大小的矩阵,螺旋输出矩阵的元素。
链接:
思路标签:
数据结构:Vector
螺旋输出就OK
解答:
- 每个旋涡圈都有上、下、左、右四个边界线;
- 每输出一个边界,相应的边界线值+1或者-1;
- 直接旋涡输出就OK;
- 注意边界的判定。
class Solution {
public:
vector<int> spiralOrder(vector<vector<int>>& matrix) {
if(matrix.size() <= 0) return {};
int rows = matrix.size();
int cols = matrix[0].size();
vector<int> spiral(rows*cols);
int u = 0, d = rows-1, l = 0, r = cols-1, k = 0;
while(true){
for(int col = l; col <= r; ++col)
spiral[k++] = matrix[u][col];
if(++u > d) break;
for(int row = u; row <= d; ++row)
spiral[k++] = matrix[row][r];
if(--r < l) break;
for(int col = r; col >= l; --col)
spiral[k++] = matrix[d][col];
if(--d < u) break;
for(int row = d; row >= u; --row)
spiral[k++] = matrix[row][l];
if(++l > r) break;
}
return spiral;
}
};
题目59:Unique Paths II
Given an integer n, generate a square matrix filled with elements from 1 to n2 in spiral order.
例子:
For example,
Given n = 3,
You should return the following matrix:
[
[ 1, 2, 3 ],
[ 8, 9, 4 ],
[ 7, 6, 5 ]
]
问题解析:
给定数字n,构造n*n的螺旋矩阵。
链接:
思路标签:
数据结构:Vector
解答:
- 与54的上下左右边界的做法是相似的。
class Solution {
public:
vector<vector<int>> generateMatrix(int n) {
if(n < 1) return {};
vector<vector<int> > spiral(n, vector<int>(n));
int u = 0, d = n-1, l = 0, r = n-1;
int k = 1;
while(k <= n*n){
for(int col = l; col <= r; ++col)
spiral[u][col] = k++;
u++;
for(int row = u; row <= d; ++row)
spiral[row][r] = k++;
r--;
for(int col = r; col >= l; --col)
spiral[d][col] = k++;
d--;
for(int row = d; row >= u; --row)
spiral[row][l] = k++;
l++;
}
return spiral;
}
};