1 vector<int> spiralOrder(vector<vector<int>>& matrix) { 2 vector<int> arr; 3 if(matrix.empty()) 4 return arr; 5 int len = matrix.size(); 6 int wid = matrix[0].size(); 7 vector<int> vis(len*wid,0); 8 int i = 0,j = 0; 9 bool sign = true; 10 11 while(sign) { 12 if(i < len && j < wid){ 13 if(vis[i*len+j]==0) {arr.push_back(matrix[i][j]); vis[i*len+j] = 1;} 14 if(j+1<wid) { if(vis[i*len+j+1]==0) { j++; continue; }} 15 if(i+1 <len) { if(vis[(i+1)*len+j]==0) { i++; continue; }} 16 if(j > 0) { if(vis[i*len+j-1]==0){ j--; continue;}} 17 if(i > 0) { if(vis[(i-1)*len+j]==0}{ while(vis[(i-1)*len+j]==0) { i--; 18 arr.push_back(matrix[i][j]); vis[i*len+j] = 1; } } 19 if(arr.size() == len*wid) sign = false; 20 } 21 return arr; 22 } 23 }
解题思路:向右--向下--向左--向上。当输出数组size()与矩阵数组大小相同,结束循环。
首先:将第一个节点输出
向右:横坐标加1,标记,输出,直到到达最右边
向下:纵坐标加1,标记,输出,直到到达最下边
向左:横坐标-1,标记,输出,直到到达最左边
向上:纵坐标-1,标记,输出,到达已经标记的下一行
完成第一次顺时针,不断循环,直到达到循环结束条件