写点什么

算法题每日一练:螺旋矩阵 II

作者:知心宝贝
  • 2023-04-29
    江苏
  • 本文字数:903 字

    阅读完需:约 3 分钟

算法题每日一练:螺旋矩阵 II

一、问题描述

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


题目链接:螺旋矩阵 II

二、题目要求

样例 1

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

样例 2

输入: n = 1输出: [[1]]
复制代码

考察

1.模拟计算2.建议用时15~35min
复制代码

三、问题分析

这一题主要考察模拟思想,比较经典的一道题目了。



首先我们先来确定方向与边界问题,首先定义为上、下、左、右四个方向,


分别用四个字母 u、d、l、r 代表


其中,u=0(最上面的一行)、d=行数、l=0(最左侧的一列)、r=列数。


看着上面的图我们实际模拟一下每一种情况


  1. 1->2->3->4 代表着 l->r 的方向,其中行=u,列从 l->r 逐步+1,到了 4 之后,向下转向 8,那么 u 下降一行,++u

  2. 8->12->16 代表着 u->d 的方向,其中列=r,行从 u->d 逐步+1,到了 16 之后,向左转向 15,那么 r 向左移动一列,--r

  3. 15->14->13 代表着 r->l 的方向,其中行=d,列从 r->l 逐步-1,到了 13 之后,向上转向 9,那么 d 向上移动一行,--d

  4. 9->5 代表着 d->u 的方向,其中列=l,行从 d->u 逐步-1,到了 5 之后,向右转向,那么 l 向右移动一列,++l


上面就是一个循环内部的四次操作,对于循环内边界的判断:


  • 第一步 ++u>d ,退出循环

  • 第二步 --r<l ,退出循环

  • 第三步 --d<u ,退出循环

  • 第四步 ++l>r ,退出循环


上面的解法思路是给你数组,让你输出矩阵。改变一下思路就是这一道题目给你范围,让你输出数组。

四、编码实现

class Solution {public:    vector<vector<int>> generateMatrix(int n) {        int k=1,i,u=0,d=n-1,l=0,r=n-1;//初始化数据,定义上下左右四个方向范围        vector<vector<int>>v(n, vector<int>(n));//定义二维数组        while(1)//循环判断        {            for(i=l;i<=r;i++) v[u][i]=k++;//l->r方向            if(++u>d) break;            for(i=u;i<=d;i++) v[i][r]=k++;//u->d方向            if(--r<l) break;            for(i=r;i>=l;i--) v[d][i]=k++;//r->方向            if(--d<u) break;            for(i=d;i>=u;i--) v[i][l]=k++;//d->u方向            if(++l>r) break;        }        return v;
}};
复制代码

五、测试结果



发布于: 刚刚阅读数: 4
用户头像

知心宝贝

关注

公众号:穿越计算机的迷雾 2022-03-07 加入

生于尘埃 溺于人海 死于理想高台

评论

发布
暂无评论
算法题每日一练:螺旋矩阵 II_数据结构_知心宝贝_InfoQ写作社区