wangshoutong

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理
  4 随笔 :: 0 文章 :: 0 评论 :: 72 阅读

题目描述

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

示例

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

image

解题思路

  • 没有具体的算法,考察的是模拟实现过程
  • 一圈一圈的循环赋值(当n是奇数的时候,会少一圈,但是中间会有一个空值)
  • 坚持循环不变量原则,循环条件:左闭右开(对应的循环条件总是<或者>,没有=)

代码实现

class Solution {
public:
    vector<vector<int>> generateMatrix(int n) {
        //定义一个二维数组
         vector<vector<int>> res(n, vector<int>(n, 0));
         int startx = 0;
         int starty = 0;

         int loop = (n / 2); //要循环几圈
         int mid = (n / 2); //中间的位置
         int offset = 1;    //数组下标从0开始,用于控制每次循环一条边的长度
         int count = 1; //用于生成1-n的数字

         int i,j;   //必须全局定义,不然后面有些for里不能使用

        //大圈的循环
        //n是偶数,循环n/2圈
        //n是奇数,循环n/2圈,还留有中间的空
         while(loop--){
              j = starty;
              i = startx;
             //第一圈 第一行  左闭右开,第一行最后一个元素不赋值
             for(j = starty; j < n - offset; j++){
                res[startx][j] = count++;   //先是 = count   后是count+1
             }
             //第一圈 第n列
             for( i = startx; i < n - offset; i++){
                 res[i][j] = count++;
             }
             //第一圈 第n行
             for(; j > starty; j--){
                 res[i][j] = count++;
             }
             //第一圈 第一列
             for(; i > startx; i--){
                 res[i][j] = count++;
             }
             offset += 1;
             startx ++;
             starty ++;
         }
         //如果n是奇数,还剩下中间位置
         if(n%2){
             res[mid][mid] = count;
         }
         return res;
    }
};
posted on   我要进大厂!  阅读(17)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】
点击右上角即可分享
微信分享提示