LeetCode: Spiral Matrix

Title: 

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

 

思路,其实就是模拟,之前自己写了很久,而且考虑了很多,根本就没有人家几句就写好了。。。

class Solution {
public:
    vector<int> spiralOrder(vector<vector<int> > &matrix) {
        // Start typing your C/C++ solution below
        // DO NOT write int main() function
        if(matrix.size() == 0) return vector<int>();
        int x1 = 0;
        int y1 = 0;
        int x2 = matrix.size()-1;
        int y2 = matrix[0].size()-1;
        vector<int> ans;
        while(x1 <= x2 && y1 <= y2)
        {
            //up row
            for(int i = y1; i <= y2; ++i) ans.push_back(matrix[x1][i]);
            //right column
            for(int i = x1+1; i <= x2; ++i) ans.push_back(matrix[i][y2]);
            //bottom row 用来防止只剩下一行
            if(x2 != x1)
            for(int i = y2-1; i >= y1; --i) ans.push_back(matrix[x2][i]);
            //left column 用来防止只剩下一列
            if(y1 != y2)
            for(int i = x2-1; i > x1; --i) ans.push_back(matrix[i][y1]);
            
            x1++, y1++, x2--, y2--;
        }

        return ans;
    }
};

Title Given an integer n, generate a square matrix filled with elements from 1 to n2 in spiral order.

For example,
Given n = 3,

You should return the following matrix:

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

class Solution{
public:
    vector<vector<int> > generateMatrix(int n){
        vector<vector<int> > result;
        if (0 == n){
            return result;
        }
        for (int i = 0 ; i < n; i++){
            vector<int> v(n);
            result.push_back(v);
        }
        int x1 = 0, x2 = n-1,y1 = 0,y2 = n-1;
        int count = 1;
        while (x1 <= x2 && y1 <= y2){
            for (int i = y1; i <= y2; i++){
                result[x1][i] = count++; 
            }
            for (int i = x1+1; i <= x2; i++)
                result[i][y2] = count++;
            for (int i = y2-1; i >= y1; i--)
                result[x2][i] = count++;
            for (int i = x2-1; i >= x1+1; i--)
                result[i][y1] = count++;
            x1++;y1++;x2--;y2--;
        }
        return result;
    }
};

 

posted on 2015-04-28 13:36  月下之风  阅读(127)  评论(0编辑  收藏  举报

导航