首页 > 其他分享 >leecode 59-螺旋矩阵Ⅱ

leecode 59-螺旋矩阵Ⅱ

时间:2024-09-23 18:51:14浏览次数:9  
标签:59 matrix int 位置 矩阵 leecode 填数 向上 id

leecode 59-螺旋矩阵Ⅱ


题目

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

示例1
在这里插入图片描述
输入:n = 3
输出:[[1,2,3],[8,9,4],[7,6,5]]

示例 2:
输入:n = 1
输出:[[1]]

解题方法

1 循环

题目的要求是右–>下–>左–>上–>右这样的循环方式来填数,所以我们的思路也是如此,因为是个矩阵,所以是个二维数组,但是不适合用for循环,因为我们的螺旋方式的 i 和 j 都是有增有减,如果是用两个for循环来控制,比较麻烦。又因为要填的数字的个数是确定的,所以可以用一个 while 循环来操作。
所谓填数其实就是找位置,只要每次找到下一个要填数的位置即可,每填一个数,让待填的数字+1就行,直到填的数字累积到n^2。寻找位置的思路在代码的注释中给出来了,要注意的是从向上找到向右找的转换,只有当我们向上顶到头(也就是上一个位置被填过了,也就是不为0),才会向右找,所以需要设立一个标识符 id 来区分向上和向右。
以下是java实现的代码

class Solution {
    public int[][] generateMatrix(int n) {
        int[][] matrix = new int[n][n];
        matrix[0][0] = 1;//第一个位置永远是1
        int id = 0;//设置标识符,0表示向右,1表示向上
        int num = 2;//从2开始填
        int i = 0;
        int j = 1;
        while(num<=n*n){//填够数就结束
            matrix[i][j] = num++;//当前位置填数

            //下面代码都是用来找下一个填数的位置
            //向右:当右边还有位置,并且右边没有被填过时,向右移一个位置
            if(j+1<n && matrix[i][j+1] == 0 && id == 0){
                j++;
                continue;
            }
            //向下:当下边还有位置,并且下边没有被填过时,向下移一个位置
            if(i+1<n && matrix[i+1][j] == 0){
                i++;
                continue;
            }
            //向左:与上面类似,但是要注意标识符的更改
            if(j-1>=0 && matrix[i][j-1] == 0){
                j--;
                id = 1;//修改id,准备开始向上找
                continue;
            }
            //向上:少一个条件,因为向上不可能越界
            //注意标识符,当上边的位置被填过时,才开始向右移动
            if(matrix[i-1][j] == 0 && id==1){
                i--;
                if(matrix[i-1][j]!=0){
                    id = 0;//向上顶到头,修改id,开始向右找
                }
                continue;
            }
        }
        return matrix;
    }
}

标签:59,matrix,int,位置,矩阵,leecode,填数,向上,id
From: https://blog.csdn.net/qq_46440072/article/details/142393230

相关文章

  • ECE598HZ: Advanced Topics in Machine Learning
    ECE598HZ:AdvancedTopicsinMachineLearningandFormalMethodsFall2024Homework1DueSep2311:59pmCTTypesetyoursolutionsusingLATEX,createasinglezip fileincludingyoursolutions(ina singlePDF file), your code, andinstructionstorun......
  • 二维矩阵的行、列、斜线特征(二维数组)
    1.行特征二维n*m矩阵,用x[i][j]表示第i行第j列的元素。同一行的元素的i值是相同的。例如,上图中绿色格子的数组元素分别是x[4][1],x[4][2],x[4][3],x[4][4],x[4][5],x[4][6]。2.列特征二维n*m矩阵,用x[i][j]表示第i行第j列的元素。同一列的元素的j值是相同......
  • P5975 photo 题解
    Solution先离散化,记\(f(l,r,p)\)为覆盖了\([l,r]\)区间内纵坐标\(\gep\)的点最少矩形个数。则:\[f(l,r,p)=\min(f(l,r,p),f(l,mid,p)+f(mid+1,r,p))\]\[f(l,r,p)=\min(f(l,r,p),f(l,r,res)+1)\]令\(h\)为用面积为\(S\)的矩形去覆盖\([l,r]\)区间的高度,即\(S/(r......
  • 火星人集成灶F59说明书
     官网电话:4008888490                   aa......
  • Mathtype公式相关:在mathtype中添加任意维数矩阵的方法以及矩阵中省略号的问题;输入空格
    一、在mathtype中添加任意维数矩阵的方法以及矩阵中省略号的问题使用mathtype创建任意维数的矩阵:打开mathtype后可点击矩阵工具栏,再点击右下角的图形,具体情况如下图所示。点击之后会弹出一个对话框如下图所示,可在行列处输入自己想要的行数和列数。使用此方法创建的矩阵都是......
  • Datawhale Leecode基础算法篇 task02:递归算法and分治算法
    官方学习文档:datawhalechina往期task01:枚举算法链接:DatawhaleLeecode基础算法篇task01:枚举算法递归算法递归简介递归(Recursion):指的是一种通过重复将原问题分解为同类的子问题而解决的方法。在绝大数编程语言中,可以通过在函数中再次调用函数自身的方式来实现递归。举......
  • 力扣最热一百题——搜索二维矩阵
    目录题目链接:240.搜索二维矩阵II-力扣(LeetCode)题目描述解法一:暴力不解释Java写法:运行时间C++写法:运行时间时间复杂度以及空间复杂度 解法二:利用自带的大小关系进行Z型走位Java写法:运行时间C++写法运行时间时间复杂度以及空间复杂度总结题目链接:240.......
  • Leetcode 378. 有序矩阵中第 K 小的元素
    1.题目基本信息1.1.题目描述给你一个nxn矩阵matrix,其中每行和每列元素均按升序排序,找到矩阵中第k小的元素。请注意,它是排序后的第k小元素,而不是第k个不同的元素。你必须找到一个内存复杂度优于O(n^2)的解决方案。1.2.题目地址https://leetcode.cn/problem......
  • Leecode 最大子数组和
    思路1:先了解前缀和的概念,  ,这题的答案可以转换为:将前缀和pre数组的下标作为x,下标对应的值作为y,建立坐标系得到一条pre折线,找到折现所有最小值与最大值差值最大的(最小值在前最大值在后)值就是本题的答案,也是与买卖股票最佳时机思路一样了思路2:对于以nums[j]元素为结尾的最大......
  • Leecode 滑动窗口最大值
     使用了双向链表输入:nums=[1,3,-1,-3,5,3,6,7],和k=3输出:[3,3,5,5,6,7]解释过程中队列中都是具体的值,方便理解,具体见代码。初始状态:L=R=0,队列:{}i=0,nums[0]=1。队列为空,直接加入。队列:{1}i=1,nums[1]=3。队尾值为1,3>1,弹出队尾值,加入3。队列:{3}i=2,nums[......