C++:Leetcode-螺旋矩阵-59题螺旋矩阵

C++:Leetcode-螺旋矩阵-59题螺旋矩阵

重点是循环不变性原则,把握住循环的一致性,同时理清每一次循环何为变量
然后按运行流程进行写代码。
本题考察对题目模拟过程的能力



题目

给你一个正整数 n ,生成一个包含 1 到 n2 所有元素,且元素按顺时针顺序螺旋排列的 n x n 正方形矩阵 matrix 。


思路分析

重点:
1、循环不变量,每一条边的处理情况有统一一致,此代码采用左闭右开原则
2、一圈为一循环,手写一圈流程,将流程进行代码描述,知道何为循环变量
3、n*n的矩阵是循环n/2圈,每循环一圈起点(startX,startY)会发生改变,所以每一圈都要startX++,startY++;每循环一圈后圈也会变小,所以每一圈都要offset++,让圈变小
4、奇数矩阵,最后要对矩阵的最中间的位置进行赋值, nums[n / 2][n / 2] = count;

代码

/*
Leetcode-螺旋矩阵-59题
题目:
给你一个正整数 n ,生成一个包含 1 到 n2 所有元素,且元素按顺时针顺序螺旋排列的 n x n 正方形矩阵 matrix 。

重点:
1、循环不变量,每一条边的处理情况有统一一致,此代码采用左闭右开原则
2、一圈为一循环,手写一圈流程,将流程进行代码描述,知道何为循环变量
*/

#include "iostream"
#include "vector"
using namespace std;
class Solution
{
public:
    vector<vector<int>> generateMatrix(int n)
    {
        //起点(startX,startY)
        //在遍历每一条边时,起点是变量
        //一圈之后每一条边的大小改变,用offset来控制变量
        int startX = 0;
        int startY = 0;
        int offset = 1;

        //i代表行,j代表列
        int i;
        int j;

        //赋值计数算子
        int count = 1;

        //存储螺旋矩阵
        //结构等同二维数组
        vector<vector<int>> nums(n, vector<int>(n, 0));

        //n*n的矩阵,循环n/2圈
        int loop = n / 2;
        while (loop--)
        {
            i = startX;
            j = startY;
            //上行
            //遵循左闭右开原则,只赋值第一个元素,不赋值最后一个元素
            for (j = startY; j < n - offset; j++)
            {
                nums[startX][j] = count++;
            }
            //右列
            for (i = startX; i < n - offset; i++)
            {
                nums[i][j] = count++;
            }
            //下行
            for (; j > startY; j--)
            {
                nums[i][j] = count++;
            }
            //左列
            for (; i > startX; i--)
            {
                nums[i][j] = count++;
            }

            //循环一圈后,起点变了,圈变小了所以offset变了
            startX++;
            startY++;
            offset++;
        }
        //若n是奇数,将最后的值赋值给矩阵剩下最中间的位置
        //最中间的位置为nums[n/2][n/2]
        if (n % 2 == 1)
        {
            nums[n / 2][n / 2] = count;
        }
        return nums;
    }
};

int main(int argc, char const *argv[])
{
    Solution s1;
    vector<vector<int>> nums;
    nums = s1.generateMatrix(6);

    //输出测试
    for (vector<vector<int>>::iterator it = nums.begin(); it != nums.end(); it++)
    {
        for (vector<int>::iterator itt = it->begin(); itt != it->end(); itt++)
        {
            cout << *itt << "\t";
        }
        cout << endl;
    }

    return 0;
}


总结

熟悉了螺旋矩阵的题型,熟悉了循环不变量原则,抓住何为循环变量,何为循环不变量。
增加了模拟过程的熟悉。
参考代码随想录https://www.programmercarl.com/0059.%E8%9E%BA%E6%97%8B%E7%9F%A9%E9%98%B5II.html#_59-%E8%9E%BA%E6%97%8B%E7%9F%A9%E9%98%B5ii

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值