每日一题(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.写出代码
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;}
};