力扣54 输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字。
输入:matrix = [[1,2,3],[4,5,6],[7,8,9]] 输出:[1,2,3,6,9,8,7,4,5] m == matrix.length n == matrix[i].length 1 <= m, n <= 10 -100 <= matrix[i][j] <= 100
解题思路:
顺时针打印分成四部:“从左向右、从上向下、从右向左、从下向上”,在循环时只需要不断检验边界,缩小边界即可
注意:
res[x++]
等价于先给 res[x]
赋值,再给 x
自增 11;++t > b
等价于先给 t
自增 1,再判断 t > b
逻辑表达式 class Solution {
public:
vector spiralOrder(vector>& matrix) {
if(matrix.empty()) return {};
//定义边界
int left = 0,right = matrix[0].size()-1,top = 0,buttom = matrix.size()-1;
vector res;
while(true){
//从左到右
for(int i = left;i<=right;i++) res.push_back(matrix[left][i]);
//从上到下
if(++top>buttom) break;//到底了,返回
for(int i = top;i<=buttom;i++) res.push_back(matrix[i][right]);
//从右往左
if(--right=left;i--) res.push_back(matrix[buttom][i]);
//从下到上
if(--buttom=top;i--) res.push_back(matrix[i][left]);
//向右缩进,进入循环
if(++left>right) break;
}
return res;
}
};
59. 螺旋矩阵 II
给你一个正整数 n
,生成一个包含 1
到 n2
所有元素,且元素按顺时针顺序螺旋排列的 n x n
正方形矩阵 matrix
。
class Solution {
public:
vector> generateMatrix(int n) {
vector> res(n,vector(n,0));
int left = 0,right = n-1,top = 0,buttom = n-1;
int k = 1;
while(true){
//从左到右
for(int i = left;i<=right;i++){
res[top][i] = k;
k++;//出去时k=4
}
//从上往下
if(++top>buttom) break;
for(int i =top;i<=buttom;i++){
res[i][right] = k;
k++;//出去时k=6
}
//从左往右
if(--right=left;i--){
res[buttom][i] = k;
k++;//出去时k=8
}
//从下往上
if(--buttom=top;i--){
res[i][left] = k;
k++;//出去时k=9
}
//循环判断
if(++left>right) break;
}
return res;
}
};
解法:跟前面思路一致,只需要保证nullptr 输入-1,下一个节点继续保持指针不变即可
class Solution {
public:
vector> spiralMatrix(int m, int n, ListNode* head) {
vector> res(m,vector(n,-1));
int left = 0,right = n-1,top = 0,buttom = m-1;
while(true){
//从左到右
for(int i = left;i<=right;i++){
res[top][i] = (head ==nullptr?-1:head->val);
head = (head ==nullptr?head:head->next);
}
//从上往下
if(++top>buttom) break;
for(int i =top;i<=buttom;i++){
res[i][right] = (head ==nullptr?-1:head->val);
head = (head ==nullptr?head:head->next);
}
//从左往右
if(--right=left;i--){
res[buttom][i] = (head ==nullptr?-1:head->val);
head = (head ==nullptr?head:head->next);
}
//从下往上
if(--buttom=top;i--){
res[i][left] = (head ==nullptr?-1:head->val);
head = (head ==nullptr?head:head->next);
}
//循环判断
if(++left>right) break;
}
return res;
}
};
885. 螺旋矩阵 III
在 R 行 C 列的矩阵上,我们从 (r0, c0) 面朝东面开始这里,网格的西北角位于第一行第一列,网格的东南角位于最后一行最后一列。现在,我们以顺时针按螺旋状行走,访问此网格中的每个位置。每当我们移动到网格的边界之外时,我们会继续在网格之外行走(但稍后可能会返回到网格边界)。最终,我们到过网格的所有 R * C 个空间。按照访问顺序返回表示网格位置的坐标列表。
class Solution {
public:
vector> spiralMatrixIII(int rows, int cols, int rStart, int cStart) {
vector> res;
int top = rStart;
int buttom = rStart;
int l = cStart, r = cStart;
res.push_back({rStart, cStart});
while (res.size() < rows * cols) {
r++;//限制往右一个格
for (int i = l + 1 ; i <= r; i++) {
if (top >= 0 && i >=0 && i < cols) res.push_back({top, i});
}
buttom++;//限制往下一格
for (int i = top + 1 ; i <= buttom; i++) {
if (r < cols && i >=0 && i < rows) res.push_back({i, r});
}
l--;//限制往左一格
for (int i = r - 1 ; i >= l; i--) {
if (buttom < rows && i >=0 && i < cols) res.push_back({buttom, i});
}
top--;//限制往上一格
for (int i = buttom - 1 ; i >= top; i--) {
if (l >= 0 && i >=0 && i < rows) res.push_back({i, l});
}
}
return res;
}
};