Fork me on GitHub

Leetcode54. Spiral Matrix螺旋矩阵

给定一个包含 m x n 个元素的矩阵(m 行, n 列),请按照顺时针螺旋顺序,返回矩阵中的所有元素。

示例 1:

输入: [ [ 1, 2, 3 ], [ 4, 5, 6 ], [ 7, 8, 9 ] ] 输出: [1,2,3,6,9,8,7,4,5]

示例 2:

输入: [ [1, 2, 3, 4], [5, 6, 7, 8], [9,10,11,12] ] 输出: [1,2,3,4,8,12,11,10,9,5,6,7]

 

 

感觉很乱,有空的时候重新改一下

class Solution {
public:
    vector<int> spiralOrder(vector<vector<int> >& matrix)
    {
        vector<int> res;
        int r = matrix.size();
        if(r == 0)
            return res;
        int c = matrix[0].size();
        int all = r * c;
        int up = 0;
        int down = r - 1;
        int right = c - 1;
        int left = 0;
        int cnt = 0;
        int i = 0, j = 0;
        int h = 0;
        int v = 0;
        for(int t = 0; cnt <= all; t++)
        {
            // horizontal
            if(t % 2 == 0)
            {
                if(h % 2 == 0)
                {
                    for(; j <= right; j++)
                    {
                        res.push_back(matrix[i][j]);
                        cnt++;
                        if(cnt == all)
                            break;
                    }
                    j--;
                    i++;
                    up++;
                    h++;
                }
                else
                {
                    for(; j>= left; j--)
                    {
                        res.push_back(matrix[i][j]);
                        cnt++;
                        if(cnt == all)
                            break;
                    }
                    j++;
                    i--;
                    down--;
                    h++;
                }
            }
            //vertical
            else
            {
                if(v % 2 == 0)
                {
                    for(; i <= down; i++)
                    {
                        res.push_back(matrix[i][j]);
                        cnt++;
                        if(cnt == all)
                            break;
                    }
                    i--;
                    j--;
                    right--;
                    v++;
                }
                else
                {
                    for(; i >= up; i--)
                    {
                        res.push_back(matrix[i][j]);
                        cnt++;
                        if(cnt == all)
                            break;
                    }
                    i++;
                    j++;
                    left++;
                    v++;
                }
            }
            if(cnt == all)
                break;
        }
        return res;
    }
};

 

其他方法:

class Solution {
public:
    vector<int> spiralOrder(vector<vector<int>>& matrix) {
        vector<int> result;
        if (matrix.size() == 0) {
            return result;    
        }
        int m = matrix.size(), n = matrix[0].size();
        int rowBegin = 0, rowEnd = m - 1, colBegin = 0, colEnd = n - 1;
        while (rowBegin <= rowEnd && colBegin <= colEnd) {
            for (int i = colBegin; i <= colEnd; ++i ) {
                result.push_back(matrix[rowBegin][i]);
            }
            rowBegin++;
            if (rowBegin > rowEnd) {
                break;
            }
            for (int i = rowBegin; i <= rowEnd; ++i) {
                result.push_back(matrix[i][colEnd]);
            }
            colEnd--;
            if (colBegin > colEnd) {
                break;
            }
            for (int i = colEnd; i >= colBegin; --i) {
                result.push_back(matrix[rowEnd][i]);
            }
            rowEnd--;
            if (rowBegin > rowEnd) {
                break;
            }
            for (int i = rowEnd; i>= rowBegin; --i) {
                result.push_back(matrix[i][colBegin]);
            }
            colBegin++;
        }
        return result;
    }
};

 

posted @ 2018-11-21 23:05  lMonster81  阅读(80)  评论(0编辑  收藏  举报
/*评论*/ /*top按钮*/

/* 网易云控件 */