zoukankan      html  css  js  c++  java
  • 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;
        }
    };
  • 相关阅读:
    sql 生成开始日期到结束日期相差天数或日期
    自定义表做存储过程变量
    [转]html 移动互联网终端的javascript touch事件,touchstart, touchend, touchmove
    [转]JQuery.Ajax之错误调试帮助信息
    解决IOS safari在input focus弹出输入法时不支持position fixed的问题
    查看 存储过程的执行时间
    ListView
    android矩阵详解
    跳出圈子 “莫忘初心,方得始终”
    Eclipse使用
  • 原文地址:https://www.cnblogs.com/lMonster81/p/10433864.html
Copyright © 2011-2022 走看看