[Leetcode 98] 54 Spiral Matrix

Problem:

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].

 

Analysis:

The problem is a simulation problem. With the help of a direction variable, we can go through the matrix. When a new position is not valid, then we must change the direction.

For a index (i, j) to be valid, the following creteria must be satisfied:

1. i >=0 && i < row

2. j>=0 && j < col

3. m[i][j] is not visited

 

Direction changes from right -> down -> left -> up.

 

Code:

 1 class Solution {
 2 public:
 3     int row, col, MIN = (1<<31);
 4 
 5     vector<int> spiralOrder(vector<vector<int> > &matrix) {
 6         // Start typing your C/C++ solution below
 7         // DO NOT write int main() function
 8         vector<int> res;
 9         
10         if (matrix.size() == 0)
11             return res;
12             
13         row = matrix.size(), col = matrix[0].size();
14         int dir = 0, size = row * col;
15         int row_dir[4] = {0, 1, 0, -1};
16         int col_dir[4] = {1, 0, -1, 0};
17         
18         int i=0, j=-1, total = 0;
19         while (true) {
20             i += row_dir[dir];
21             j += col_dir[dir];
22             
23             if (isValid(i, j, matrix)) {
24                 res.push_back(matrix[i][j]);
25                 matrix[i][j] = MIN;
26                 total += 1;
27                 if (total == size) break;
28             } else {
29                 // reset to last valid position
30                 i -= row_dir[dir];
31                 j -= col_dir[dir];
32                 dir = (dir + 1) % 4;
33             }
34         }
35         
36         return res;
37     }
38     
39     bool isValid(int i, int j, vector<vector<int> > & m) {
40         return (i < row && i>=0) &&( j>=0 && j < col) && (m[i][j] != MIN);
41     }
42 };
View Code

 

posted on 2013-08-06 15:14  freeneng  阅读(203)  评论(0编辑  收藏  举报

导航