提示:力扣第54题
题目
给你一个 m 行 n 列的矩阵 matrix ,请按照 顺时针螺旋顺序 ,返回矩阵中的所有元素
示例 1:
输入: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]
提示:以下是本篇文章正文内容,下面案例可供参考
解题思路
与上一篇笔记的解题方式差不多,都是模拟过程
参照力扣评论区的高赞题解,这位老哥的题解真的是很简洁优雅容易看懂,让人佩服
作者:YouLookDeliciousC
链接:https://leetcode.cn/problems/spiral-matrix/solutions/7155/cxiang-xi-ti-jie-by-youlookdeliciousc-3/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
- 首先设定上下左右边界;
- 其次向右移动到最右,此时第一行因为已经使用过了,可以将其从图中删去,体现在代码中就是重新定义上边界;
- 判断若重新定义后,上下边界交错,表明螺旋矩阵遍历结束,跳出循环,返回答案;
- 若上下边界不交错,则遍历还未结束,接着向下向左向上移动,操作过程与第一,二步同理;
- 不断循环以上步骤,直到某两条边界交错,跳出循环,返回答案;
题解:
#include<iostream>
#include<vector> //包含vector的头文件
using namespace std;
/*螺旋矩阵*/
class Solution{
public:
vector<int> array6(vector<vector<int>> & matrix){
vector<int> result; //存储返回结果的容器
if(matrix.empty()) return result; //如果matrix为空,直接返回
int up = 0; //设定上下左右边界
int left = 0;
int down = matrix.size() - 1;
int right = matrix[0].size() - 1;
while(1)
{
//第一行从左走到右,把值放入result中
for(int i = left;i<=right;i++) result.push_back(matrix[up][i]);
if(++up > down) break; //第一行已被存完数据,可以删除,即重新定义上边界
//最右列从上走到下
for(int i = up;i<=down;i++) result.push_back(matrix[i][right]);
if(--right<left) break; //删除最右列,重新定义最右列
//最后一行从最右走到最左
for(int i = right;i>=left;i--) result.push_back(matrix[down][i]);
if(--down<up) break;
//最左列从下走到上
for(int i = down;i>=up;i--) result.push_back(matrix[i][left]);
if(++left>right) break;
}
return result;
}
};
int main(void)
{
Solution s;
int V [3][4]={1,2,3,4,5,6,7,8,9,10,11,12} ; //假定有二维数组V
vector<vector<int>> maze(3,vector<int>(4,0));
//把V的数据赋给vector二维数组maze
cout << "before:" << endl;
for(int i = 0;i<maze.size();i++)
{
for(int j = 0;j<maze[i].size();j++)
{
maze[i][j] = V[i][j];
cout << maze[i][j] << " ";
}
cout << "\n";
}
cout << "after:" << endl;
vector<int> res(12,0); //存储结果的容器
res = s.array6(maze);
int rows = res.size(); //获得结果数组的个数并打印出来
for (int j = 0; j < rows; j++)
{
cout << res[j] << " ";
}
return 0;
}
运行结果:
总结
刷题的数组篇告落。继续加油!