Spiral Matrix II (螺旋写入矩阵)

题目描述

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

For example,
Given n =3,

You should return the following matrix:
[
 [ 1, 2, 3 ],
 [ 8, 9, 4 ],
 [ 7, 6, 5 ]
]

思路:这道题和Spiral Matrix的模型和解法一样。要求我们将1~n^2的数字螺旋写入矩阵中。我们依然维护四个变量,rowBegin, rowEnd, colBegin, colEnd。然后去界定螺旋的边界。我们需要注意的是,如果n 为0,我们应该返回空的数组。并且在写入数字时,我们也需要判断目前的数字是否超过最大数字N^2,如果超过,说明我们不需要遍历了。还有最重要的一点,数组在未初始化时,是不允许使用下标操作符来改变数组元素的,所以我们一定要先初始化数组,这里初始化为N行N列,元素都为0的数组。

二维vector容器存放一个矩阵是可以的,它与数组的存放形式是完全一样的。

写入与读取是一样的!!!

不需要考虑重复的情况了,因为是方阵!!!

实现代码:

             class Solution {
public:
    vector<vector<int> > generateMatrix(int n) {
        if(n==0) return vector<vector<int>> ();
        vector<vector<int>> ret(n,vector<int>(n,0));
        int rowbegin=0;
        int rowend=n-1;
        int colbegin=0;
        int colend=n-1;
        int num=1;
        while(rowbegin<=rowend && colbegin<=colend)
        {
            if(num<=n*n)
            {
                //向右遍历;
                for(int i=colbegin;i<=colend;i++)
                {
                    ret[rowbegin][i]=num;
                    num++;
                }
            }
            rowbegin++;
            if(num<=n*n)
            {
                //向下遍历;
                for(int i=rowbegin;i<=rowend;i++)
                {
                    ret[i][colend]=num;
                    num++;
                }
            }
            colend--;
            if(num<=n*n)
            {
                //向左遍历;
                for(int i=colend;i>=colbegin;i--)
                {
                    ret[rowend][i]=num;
                    num++;
                }
            }
            rowend--;
            if(num<=n*n)
            {
                //向上遍历;
                for(int i=rowend;i>=rowbegin;i--)
                {
                    ret[i][colbegin]=num;
                    num++;
                }
            }
            colbegin++;
        }
        return ret;
    }
};

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值