• leetcode 54. Spiral Matrix 、59. Spiral Matrix II


    54题是把二维数组安卓螺旋的顺序进行打印,59题是把1到n平方的数字按照螺旋的顺序进行放置

    54. Spiral Matrix

    start表示的是每次一圈的开始,每次开始其实就是从(0,0)、(1,1)这种开始的。

    用endx、endy来表示每次转圈的x、y方向的终止位置,方便后面进行边界条件设置。

    注意:后面start < endx && start < endy、start < endy && start < endx-1都必须同时满足x、y的条件,不然会出现错误

    为什么后面判断条件的时候要多个判断,因为这里使用的是4个if,如果第二个if没有执行,实际上是不应该执行第三个if,但是如果不加&&多个条件判断,代码实际上会运行。

    class Solution {
    public:
        vector<int> spiralOrder(vector<vector<int>>& matrix) {
            vector<int> result;
            int row = matrix.size();
            if(row <= 0)
                return result;
            int col = matrix[0].size();
            if(col <= 0)
                return result;
            int start = 0;
            while(start*2 < row && start*2 < col){
                int endx = row - 1 - start;
                int endy = col - 1 - start;
                for(int i = start;i <= endy;i++)
                    result.push_back(matrix[start][i]);
                if(start < endx){
                    for(int i = start + 1;i <= endx;i++)
                        result.push_back(matrix[i][endy]);
                }
                if(start < endx && start < endy){
                    for(int i = endy - 1;i >= start;i--)
                        result.push_back(matrix[endx][i]);
                }
                if(start < endy && start < endx - 1){
                    for(int i = endx - 1;i >= start + 1;i--)
                        result.push_back(matrix[i][start]);
                }
                start++;
            }
            return result;
        }
    };

    59. Spiral Matrix II

    与54题差不多,只是用一个num来表示当前存储的数字,每个计算num++

    class Solution {
    public:
        vector<vector<int>> generateMatrix(int n) {
            vector<vector<int>> result(n,vector<int>(n));
            int row = n,col = n,start = 0;
            int num = 0;
            while(start*2 < row && start*2 < col){
                int endx = row - 1 - start;
                int endy = col - 1 - start;
                for(int i = start;i <= endy;i++){
                    num++;
                    result[start][i] = num;
                }
                if(start < endx){
                    for(int i = start + 1;i <= endx;i++){
                        num++;
                        result[i][endy] = num;
                    }
                }
                if(start < endx && start < endy){
                    for(int i = endy - 1;i >= start;i--){
                        num++;
                        result[endx][i] = num;
                    }
                }
                if(start < endy && start < endx - 1){
                    for(int i = endx - 1;i >= start + 1;i--){
                        num++;
                        result[i][start] = num;
                    }
                }
                start++;
            }
            return result;
        }
    };
  • 相关阅读:
    【08月20日】A股滚动市净率PB历史新低排名
    沪深300指数的跟踪基金最近1年收益排名
    基金前15大重仓股持仓股排名
    中证500指数的跟踪基金最近1年收益排名
    【08月14日】A股ROE最高排名
    【08月13日】预分红股息率最高排名
    【08月09日】北上资金持股比例排名
    最近一月研报推荐次数最多的最热股票
    JDK源码阅读-------自学笔记(二十一)(java.util.ArrayList详细版集合类)
    MyBatis-Plus 3.0.3 Sql注入器添加,即全局配置Sql注入器,sqlInjector改写
  • 原文地址:https://www.cnblogs.com/ymjyqsx/p/10791711.html
Copyright © 2020-2023  润新知