首页 > 其他分享 >力扣59 螺旋矩阵

力扣59 螺旋矩阵

时间:2023-03-16 13:46:27浏览次数:41  
标签:sx 59 21 int 一圈 矩阵 力扣 turn vec

1、注意区间:我写的是每一次都留最后一个元素下次处理。左闭右开。

2、每次先遍历完一圈再遍历下一圈。用sx来记录 每一圈要走多少步。用 turn来记录这次应该往哪走了。

比如n=4 turn=0,sx=2时,那么最外面一圈要走两步(两步要包括在开始不用走的那个位置也就是 1  2  3写好了)

之后turn=1,再竖着写....

之后一圈完了的时候(如果此时sx>=0 就进行下一圈),此时i多减了1,此时应该 i+1,j+1(这样才是下一圈开始的位置),还要注意sx-=2;因为一圈之后两边界都缩小了1。此时turn又从0开始

继续转圈。直到sx<0,结束。并且要判断如果是奇数的话,最中心的数要加上。

class Solution {
public:
    vector<vector<int>> generateMatrix(int n) {
        vector<vector<int>>vec(n);
        int a[21][21];
        memset(a,0,sizeof(a));
        int i,j,k;
        int sx=n-2;    //走几步
        int x=0;
        int turn=0;
        int sum=1;
        i=j=0;
        if(n==1)
        {
             vec[0].push_back(1);
             return vec;
        }
        while(1){
            if(turn==0){ //往右走
                for(k=0;k<=sx;k++)
                    a[i][j++]=sum++;
                if(sum>n*n)
                  break;
                turn=1;
            }
            if(turn==1){
                for(k=0;k<=sx;k++){
                    a[i++][j]=sum++;
                }
                turn =2;
            }
            if(turn==2){
                for(k=0;k<=sx;k++){
                    a[i][j--]=sum++;
                }
                turn=3;
            }
            if(turn==3){
                for(k=0;k<=sx;k++){
                    a[i--][j]=sum++;
                }
                turn=0;
            }
            sx-=2;
            if(sx<0)
            break;
            i+=1;
            j+=1;
        }
        if(sx<0)
        {
            if(n%2)
            a[i+1][j+1]=sum;
        }
        int t=0,p=0;
        for(i=0;i<=n-1;i++){
            for(j=0;j<=n-1;j++)
            {
                vec[i].push_back(a[i][j]);
                cout<<a[i][j]<<" ";
            }
            cout<<endl;
        }
        return vec;
    }
};

 

标签:sx,59,21,int,一圈,矩阵,力扣,turn,vec
From: https://www.cnblogs.com/bhd123/p/17222236.html

相关文章

  • 【P2109 [NOI2007]】 生成树计数(状压 dp + 矩阵快速幂)
    状压dp+矩阵快速幂优化。感觉题解区几篇题解说得云里雾里的……也没有一定的证明……Link.SolutionPart1dp状态设计发现\(k\)的范围很小,具有很强的指向性——......
  • 力扣中198 打家劫舍
    动态规划 //存在数组里还能行写这个两行代码捋不清publicintrob(int[]nums){intlen=nums.length;intres=0;inttemp;......
  • 矩阵快速幂
    矩阵快速幂求自幂题目例:给定A,k,M,求对于指数为i=(1,.....,k-1)的A的幂次和对M取模#include<bits/stdc++.h>#defineintlonglongusingnamespacestd;const......
  • 子矩阵的和 | 二维前缀和
     796.子矩阵的和-AcWing题库   //二维前缀和#include<iostream>usingnamespacestd;intn,m,q,tmp;inta[1010][1010];intmain(){cin>>n>>m>......
  • CF590E Birthday
    \(\text{Solution}\)建出ACAM后利用fail树就可以确定子串关系了,如果建成有向图然后看问题,考虑最长反链等于最小链覆盖,那么就是求一个可重路径覆盖问题Floyd传递闭......
  • 力扣---1664. 生成平衡数组的方案数
    给你一个整数数组nums。你需要选择恰好一个下标(下标从0开始)并删除对应的元素。请注意剩下元素的下标可能会因为删除操作而发生改变。比方说,如果nums=[6,1,7,4,1]......
  • (17)对称矩阵的cholesky分解
    (17)对称矩阵的cholesky分解补发笔记......
  • 力扣---1662. 检查两个字符串数组是否相等
     给你两个字符串数组word1和word2。如果两个数组表示的字符串相同,返回true;否则,返回false。数组表示的字符串 是由数组中的所有元素按顺序连接形成的字符串......
  • 力扣---剑指 Offer 48. 最长不含重复字符的子字符串
    请从字符串中找出一个最长的不包含重复字符的子字符串,计算该最长子字符串的长度。示例1:输入:"abcabcbb"输出:3解释:因为无重复字符的最长子串是"abc",所以其长度为3......
  • 力扣184(MySQL)-部门工资最高的员工(中等)
    题目:表: Employee 表: Department 编写SQL查询以查找每个部门中薪资最高的员工。按 任意顺序 返回结果表。查询结果格式如下例所示。  解题思路:①先将Employ......