C++ 刷题笔记_5 螺旋矩阵II

题目

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

输入:n = 3
输出:[[1,2,3],[8,9,4],[7,6,5]]


提示:以下是本篇文章正文内容,下面案例可供参考

解题思路:

寻找规律,模拟顺时针画矩阵的过程:

  • 填充上行从左到右
  • 填充右列从上到下
  • 填充下行从右到左
  • 填充左列从下到上
    由外向内一圈一圈这么画下去。每画一条边都要坚持一致的左闭右开
    即上述例子的 [1,2,3) [3,4,5) [5,6,7) [7,8,9)

题解

示例:

#include<iostream>
#include<vector>	//包含vector的头文件

using namespace std;
/*螺旋矩阵*/

class Solution{
    public:
    vector<vector<int>>array(int n){
        vector<vector<int>> result(n,vector<int>(n,0));	//定义二维数组
        int loop = n/2; //定义圈数
        int mid = n/2;  //如果n为奇数的话,定义矩阵中间的空格值
        int startx = 0,starty = 0;  //定义起始位置
        int round = 1;  //控制每一条边遍历的长度,每次循环右边界收缩一位
        int count = 1;	
        int i,j;
        while(loop--)
        {
            i = startx;
            j = starty;
             // 四个for循环就是模拟转了一圈
            // 模拟填充上行从左到右(左闭右开)
            for(j;j<n-round;j++)
            {
                result[i][j] = count++;
            }
            // 模拟填充右列从上到下
            for(i;i<n-round;i++)
            {
              result[i][j] = count++  ;
            }
            // 模拟填充下行从右到左
            for(j;j>startx;j--)
            {
                result[i][j] = count++;
            }
            // 模拟填充左列从下到上
            for(i;i>starty;i--)
            {
                result[i][j] = count++;
            }
			// 第二圈开始的时候,起始位置要各自加1
            startx++;
            starty++;
            round += 1;

        }
        // 如果n为奇数的话,需要单独给矩阵最中间的位置赋值
        if(n%2 != 0)
        {
            result[mid][mid] = n*n;
        }
        return result;

    }
};

int main(void)
{
    Solution s;
    int n = 4;	//假设n=4
    vector<vector<int>> res(n,vector<int>(n,0));	//定义数组res
    res = s.array(n);

    // 获取二维数组的行数和列数
    int rows = res.size();
    int cols = res[0].size();
    // 遍历二维数组并打印所有元素
    for (int i = 0; i < rows; i++) 
    {
        for (int j = 0; j < cols; j++)
        {
            cout << res[i][j] << " ";
        }
        cout << endl; // 每行打印完毕后换行
    }
    return 0;
}

运行结果:
在这里插入图片描述
假设n=3,运行结果:
在这里插入图片描述


总结

这次的数组题相比与之前的算法思想较少,更多的是找规律、模拟过程。

时间复杂度 O(n^2): 模拟遍历二维矩阵的时间
空间复杂度 O(1)

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值