1. 程式人生 > >[Leetcode] spiral matrix 螺旋矩陣

[Leetcode] spiral matrix 螺旋矩陣

訪問 example play == 題意 blog 針對 mar order

Given a matrix of m x n elements (m rows, n columns), return all elements of the matrix in spiral order.

For example,
Given the following matrix:

[
 [ 1, 2, 3 ],
 [ 4, 5, 6 ],
 [ 7, 8, 9 ]
]

You should return[1,2,3,6,9,8,7,4,5].

題意:以螺旋的方式,順時針訪問數組。

思路:按照遍歷的方向來不停的結果中壓入值:左到右、上到下、右到左、下到上......一圈圈的向內訪問。這裏的難點有兩處,一、圈與圈之間的過渡;二、若最後,只剩一行或者一列怎麽辦。針對第一個問題,我們可以定義四個變量,分別代表左右、上下,按照訪問的順序存入值。針對第二問題,若只剩一列,我們從上到下訪問,並返回結果,只剩一行時,同理。還有一個問題是,訪問時,變量 i 的取值範圍。這可以按如下的方式取值,即,訪問方向上,行或列的最後一個留個下一個循環去訪問。

技術分享

代碼如下:

 1 class Solution {
 2 public:
 3     vector<int> spiralOrder(vector<vector<int> > &matrix) 
 4     {
 5         vector<int> res;
 6         if(matrix.size()==0||matrix[0].size()==0)   return res;
 7 
 8         int left=0,right=matrix[0].size()-1;
 9         int up=0,down=matrix.size()-1
; 10 11 while(right>=left && down>=up) 12 { 13 if(right==left) //單列 14 { 15 for(int i=up;i<=down;++i) 16 { 17 res.push_back(matrix[i][right]); 18 } 19 return
res; 20 } 21 else if(up==down) //單行 22 { 23 for(int i=left;i<=right;++i) 24 { 25 res.push_back(matrix[up][i]); 26 } 27 return res; 28 } 29 30 for(int i=left;i<right;++i) //左到右 31 res.push_back(matrix[up][i]); 32 33 for(int i=up;i<down;++i) //上到下 34 res.push_back(matrix[i][right]); 35 36 for(int i=right;i>left;i--) //右到左 37 res.push_back(matrix[down][i]); 38 39 for(int i=down;i>up;i--) //下到上 40 res.push_back(matrix[i][left]); 41 42 up++; 43 left++; 44 down--; 45 right--; 46 } 47 return res; 48 } 49 };

[Leetcode] spiral matrix 螺旋矩陣