每日一题(LeetCode)----数组--螺旋矩阵(一)
1.题目(54. 螺旋矩阵)
给你一个 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
2.解题思路
思路一
1.我们先根据矩阵的行数和列数(行数/2和列数/2中较小的那个就是循环的次数)确定要从左到右,从上到下,从右到左,从下往上循环几次,
2.然后我们进行遍历,把遍历到的元素放到新创建的vector中,每次遍历一个循环之后,下一次遍历循环的初始位置是当前循环的x坐标+1,y坐标+1(注意刚开始遍历时循环的初始位置是0,0),并且下一次遍历循环的每一条边的长度都要减一
3.填补中间位置
1>如果矩阵的行数和列数有一个小于二,那不用填补中间位置
2>如果矩阵的行数和列数都大于2了,那么看行数和列数谁更小,判断小的那个是不是偶数
如果是,那么结束操作
如果不是且当前列数较大,那么从当前位置向右继续遍历列数-行数+1个元素,并放入到新创建的vector中
如果不是且当前行数较大,那么从当前位置向下继续遍历行数-列数+1个元素,并放入到新创建的vector中
4.返回新创建的vector,操作结束
注意:如果行数等于1或者列数等于1要进行特别判断
如果行数等于1,那么我们从初始位置向右遍历m个元素,并放入到新创建的vector中,然后返回新创建的vector中即可
如果列数等于1,那么我们从初始位置向下遍历m个元素,并放入到新创建的vector中,然后返回新创建的vector中即可
3.写出代码
c++
class Solution {
public:
vector<int> spiralOrder(vector<vector<int>>& matrix) {
int m=matrix.size();
int n=matrix[0].size();
vector<int> res(m*n,0);
int dirx=0;
int diry=0;
int loop=min(m/2,n/2);
int offset=1;
int count=0;
if(n==1){
while(m--){
res[count]=matrix[count][0];
count++;
}
return res;
}
if(m==1){
while(n--){
res[count]=matrix[0][count];
count++;
}
return res;
}
while(loop--){
int i=dirx;
int j=diry;
//从左到右
for(;j<n-offset;j++){
res[count++]=matrix[i][j];
}
//从上到下
for(;i<m-offset;i++){
res[count++]=matrix[i][j];
}
//从右到左
for(;j>diry;j--){
res[count++]=matrix[i][j];
}
//从下往上
for(;i>dirx;i--){
res[count++]=matrix[i][j];
}
dirx++;
diry++;
offset++;
}
if(m%2!=0&&n>=m&&m>2&&n>2){
int t=n-m+1;
while(t--){
res[count++]=matrix[dirx][diry];
diry++;
}
}
if(n%2!=0&&m>n&&m>2&&n>2){
int t=m-n+1;
while(t--){
res[count++]=matrix[dirx][diry];
dirx++;
}
}
return res;
}
};