leetcode no.54 螺旋矩阵(数组)
顺时针访问数组,到边界(超出矩阵大小或遇到已访问折回去),转方向需要注意操作。
- 转方向条件:横竖越界或者碰到vis=1 退出条件:访问完m*n个元素
- 每次刚进来让temp=start,里层循环一条线一个方向,每次试探之前让start=temp(即上一轮移动结果),当前start点设置为已访问,然后产生新的temp,最后temp违规,更新方向,之后修改start(此处如果不修改,哪那么下一次进来还是vis=1的start)。进入下一轮大循环。
- 有大于0的判断,且必须在判断vis数组为0之前,不然访问负下标直接报错
- 记得更新color的值
注意为空的时候没有横向长度,metric[0].size是不合法的。
class Solution { public: vector<int> spiralOrder(vector<vector<int>>& matrix) { vector<int>ans; int len1=matrix.size(); if(len1==0) return ans; int len2=matrix[0].size(); int x[4]={0,1,0,-1}; int y[4]={1,0,-1,0}; int startx=0; int starty=0; int tempx=startx; int tempy=starty; int color=0; int vis[100][100]={0}; int i=0; while(color<len1*len2) { tempx=startx; tempy=starty; //printf("(%d,%d)",startx,starty); while(tempx<len1 && tempy<len2 && tempx>=0 && tempy>=0 && vis[tempx][tempy]==0 ) { startx=tempx; starty=tempy; vis[tempx][tempy]=1; //printf("%d",matrix[startx][starty]); color++; ans.push_back(matrix[startx][starty]); tempx+=x[i]; tempy+=y[i]; } i++; i=i%4; startx+=x[i]; starty+=y[i]; } return ans; } };
时间才能证明一切,选好了就尽力去做吧!