【数组基础】Leetcode 59. 螺旋矩阵 II

59. 螺旋矩阵 II

解题思路

没有什么捷径,就是顺时针循环遍历矩阵即可,注意n为奇数时需要额外定义正中心格子数值为n^2。注意依次遍历矩阵边长时应当“左开右闭”,遍历最大矩阵边长也只能遍历n-1个单位,此后分别遍历n-3,n-5...个单位。注意这里的二维数组vector需要手动分配内存,否则编译器会报错。另外,数组表示矩阵的顺序是先行后列。

完整代码

#include <vector>

using namespace std;

class Solution {
public:
    vector<vector<int> > generateMatrix(int n)
    {
        vector<vector<int>> matrix(n, vector<int>(n, 0));
        int cont = 1;

        for(int i = 1; i < n; i += 2)
        {
            int k = (i-1)/2;
            for(int m = k; m < n-1-k; m++)
            {
                matrix[k][m] = cont;
                cont++;
            }

            for(int j = k; j < n-1-k; j++)
            {
                matrix[j][n-1-k] = cont;
                cont++;
            }

            for(int m = n-1-k; m > k; m--)
            {
                matrix[n-1-k][m] = cont;
                cont++;
            }

            for(int j = n-1-k; j > k; j--)
            {
                matrix[j][k] = cont;
                cont++;
            }
        }

        if((n & 1) == 1)
            matrix[(n-1)/2][(n-1)/2] = n*n;

        return matrix;
    }
};


int main()
{
    Solution sol;
    sol.generateMatrix(9);
    return 0;
}

 总结

1.使用malloc分配二维数组内存(假设给n行m列矩阵分配内存):

#include <stdlib>

int** matrix = (int**) malloc (sizeof(int*)*n);
for(int i = 0; i < n; i++)
   int* matrix[i] = (int*) malloc (sizeof(int)*m);

//...

for(int i = 0; i < n; i++)
   free(matrix[i]);
free(matrix);

2.使用vector定义二维数组也需要分配内存

首先看一维vector定义方法:

vector<int> arr (n, 0) //大小为n, 内部元素初始化为0;

对比批量定义vector:  

vector<int> arr[n]    //定义n个编号为arr[i] (0<i<n)的动态数组

再看本题里的矩阵定义方法:

 vector<vector<int> > res(n, vector<int>(n, 0)) //大小为n×n的二维矩阵,并将其所有元素初始化为vector<int>(n, 0)。
  • 5
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Andy_Xie007

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值