当你的才华还撑不起你的野心时,你应该静下心去学习 。
题目描述
输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字。
输入:matrix = [[1,2,3],[4,5,6],[7,8,9]]
输出:[1,2,3,6,9,8,7,4,5]
解题思路
-
空值处理: 当 matrix 为空时,直接返回空列表 [] 即可。
-
初始化: 矩阵 左、右、上、下 四个边界 l , r , t , b ,用于打印的结果列表 res 。
-
循环打印: “从左向右、从上向下、从右向左、从下向上” 四个方向循环,每个方向打印中做以下三件事 (各方向的具体信息见下表) ; 1. 根据边界打印,即将元素按顺序添加至列表 res 尾部; 2. 边界向内收缩 11 (代表已被打印); 3. 判断是否打印完毕(边界是否相遇),若打印完毕则跳出。
-
返回值: 返回 res 即可。
class Solution {
public int[] spiralOrder(int[][] matrix) {
if(matrix.length == 0) return new int[0];
int l = 0, r = matrix[0].length - 1, t = 0, b = matrix.length - 1, x = 0;
int[] res = new int[(r + 1) * (b + 1)];
while(true) {
for(int i = l; i b) break;
for(int i = t; i --r) break;
for(int i = r; i >= l; i--) res[x++] = matrix[b][i]; // right to left.
if(t > --b) break;
for(int i = b; i >= t; i--) res[x++] = matrix[i][l]; // bottom to top.
if(++l > r) break;
}
return res;
}
}
// 关注TechGuide,大厂笔经面经闪电速递!
CPP版本
class Solution
{
public:
vector spiralOrder(vector& matrix)
{
if (matrix.empty()) return {};
vector res;
int l = 0; //左边界
int r = matrix[0].size() - 1; //右边界
int t = 0; //上边界
int b = matrix.size() - 1; //下边界
while (true)
{
//left -> right
for (int i = l; i b) break;
//top -> bottom
for (int i = t; i = l; i--) res.push_back(matrix[b][i]);
if (--b top
for (int i = b; i >= t; i--) res.push_back(matrix[i][l]);
if (++l > r) break;
}
return res;
}
}
// 关注TechGuide,大厂笔经面经闪电速递!
创作不易,你的鼓励是我创作的动力,如果你有收获,点个赞吧👍