题型:矩阵(二维数组)、边界问题
链接:54. 螺旋矩阵 - 力扣(LeetCode)
来源:LeetCode
题目描述
给你一个 m
行 n
列的矩阵 matrix
,请按照 顺时针螺旋顺序 ,返回矩阵中的所有元素。
很有趣的一个题,建议配合样例食用
题目样例
示例 1:
输入:matrix = [[1,2,3],[4,5,6],[7,8,9]] 输出:[1,2,3,6,9,8,7,4,5]
示例 2:
输入:matrix = [[1,2,3,4],[5,6,7,8],[9,10,11,12]] 输出:[1,2,3,4,8,12,11,10,9,5,6,7]
提示:
m == matrix.length
n == matrix[i].length
1 <= m, n <= 10
-100 <= matrix[i][j] <= 100
题目思路
笔者思路看了题解后,茅塞顿开,这里引一下(也不能算严格意义上的题解,是鲤鱼大佬的视频):鲤鱼大佬视频讲解https://www.bilibili.com/video/BV1Bb4y1x7xX/?spm_id_from=333.337.search-card.all.click&vd_source=a5b16b6aacc8b1e1029bbdc316cccfcf
当然笔者不会因此当懒狗的
OK,就这鲤鱼大佬的思路说一下:n x m 的矩阵实际上可以用二维数组 a[n][m] 来实现(讲道理这道题在纸上画一下很有利于理解)。
然后说一下题型那里的【边界处理】什么意思:不抽象的解释,可以给矩阵的四周划线,每遍历完一个边界(比方说遍历完第一行,是把上边界遍历完了;遍历完最后一列,是吧右边界遍历完了),就让这个边界【向内移动】——即“上往下走,右往左走,下往上走……”当然题目描述是顺时针遍历,所以按照这个顺序遍历,并不断更新边界,这个很有意思的题就解决了。
感觉是个很好理解且具象的思路。
C++代码
class Solution {
public:
vector<int> spiralOrder(vector<vector<int>>& matrix) {
//边界问题
/*
1.遍历边界元素
2.遍历完一次后,边界移动
3.当边界“越界”(比如上边界 跑到 下边界的下面)
*/
vector<int>answer;
// 列数 行数
int column = matrix[0].size(),row = matrix.size();
int up = 0,left = 0,down = row -1,right = column -1;
while(1)
{
// 遍历上边界
for(int i=left;i<=right;i++)
{
answer.push_back(matrix[up][i]);
}
++up;
if(up > down)
break;
// 遍历右边界
for(int i=up;i<=down;i++)
{
answer.push_back(matrix[i][right]);
}
--right;
if(left > right)
break;
// 遍历下边界
for(int i=right;i>=left;i--)
{
answer.push_back(matrix[down][i]);
}
--down;
if(up > down)
break;
// 遍历左边界
for(int i=down;i>=up;i--)
{
answer.push_back(matrix[i][left]);
}
++left;
if(left > right)
break;
}
return answer;
}
};