首页 > 其他分享 >LeetCode59. 螺旋矩阵Ⅱ

LeetCode59. 螺旋矩阵Ⅱ

时间:2023-10-15 23:13:14浏览次数:36  
标签:matrix 螺旋 int initIndex 矩阵 LeetCode59 ++ initNum

题目描述

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

示例

image

提交的代码

class Solution {
    int matrixLen=0;
    public int[][] generateMatrix(int n) {
	//初始化空数组
        int[][] matrix=new int[n][n];
	//每个位置的值,递增1
        int initNum=1;
	//每一圈左上角的初始index
        int initIndex=0;
	//矩阵边长,留待给对称位置赋值时用
        matrixLen=n;
	//递归给矩阵赋值
        outerMatrix(matrix,initIndex,initNum,n);
        return matrix;
    }

    public void outerMatrix(int[][] matrix,int initIndex,int initNum,int initLen){
	//当矩阵长为1和2的时候特殊处理
        if(initLen==1){
            matrix[initIndex][initIndex]=initNum;
        }else if(initLen==2){
            matrix[initIndex][initIndex]=initNum++;
            matrix[initIndex][initIndex+1]=initNum++;
            matrix[initIndex+1][initIndex+1]=initNum++;
            matrix[initIndex+1][initIndex]=initNum++;
        }else{

            int j=initIndex;
            int k=initIndex;
            int gap=(initLen-1)*2;
	    //7字形拐角的第一段赋值
            for(int i=0;i<initLen;i++,k++){
                matrix[j][k]=initNum;
		//给对称位置赋值
                matrix[matrixLen-j-1][matrixLen-k-1]=initNum+gap;
                initNum++;
            }
            j++;
            k--;
	    //7字形拐角的第二段赋值
            for(int i=0;i<initLen-2;i++){
                matrix[j][k]=initNum;
                matrix[matrixLen-j-1][matrixLen-k-1]=initNum+gap;
                if (i==initLen-3){
                    initNum=initNum+gap;
                }else{
                    initNum++;
                }
                j++;
            }
            outerMatrix(matrix,++initIndex,++initNum,initLen-2);
        }
    }
}

思路
image

最外面一圈只处理如图所示的一半,另一半用对称的方法来赋值,可以观察到第一圈对称位置的值相差6,通过(4-1)*2得到,内圈对称的位置相差2,(2-1)*2。
然后用递归的方法来处理内圈。startIndex=0,1,2....。
当圈的半径为1和2时特别处理,如上面代码所示。

学习到的方法

class Solution {
    public int[][] generateMatrix(int n) {
        int[][] matrix=new int[n][n];

        //计算所给的n,需要转几圈,如2就一圈,3就一圈加一个单独的值,4就两圈完成,5就两圈加一个单独的值
        int loop=n/2;
        //计算如果是奇数的话,那么最后的且是最中心的点,它的index是什么
        int centralIndex=n/2;
        //每一圈的起始index(0,0)(1,1)
        int startX=0;
        int startY=0;
        //每一圈不需要处理的个数
        int offset=1;
        //每一个空位需要填充的值(每次+1)
        int currentValue=1;

        int i;
        int j;
        while(loop>0){
            i=startX;
            j=startY;

            for(;j<n-offset;j++){
                matrix[i][j]=currentValue++;
            }
            for(;i<n-offset;i++){
                matrix[i][j]=currentValue++;
            }
            for(;j>startY;j--){
                matrix[i][j]=currentValue++;
            }
            for(;i>startX;i--){
                matrix[i][j]=currentValue++;
            }

            // 第二圈开始的时候,起始位置要各自加1, 例如:第一圈起始位置是(0, 0),第二圈起始位置是(1, 1)
            startX++;
            startY++;

            // offset 控制每一圈里每一条边遍历的长度
            offset += 1;

            loop--;
        }
         // 如果n为奇数的话,需要单独给矩阵最中间的位置赋值
        if ((n % 2)==1) {
            matrix[centralIndex][centralIndex] = currentValue;
        }
        return matrix;
    }
}

思路
image
如图所示,遵从左闭右开的方法,第一行的最后一个不处理,留给最后一列用刚才的方法,最右一列的最后一个不处理,最后一行从右向左的最后一个不处理,留待左列从下向上处理length减一个。
这样转圈处理起来代码好写,只需要考虑好每次循环的startIndex,给出的n需要转几圈(n/2),,offset(左闭右开,最后一个不处理需要用到)的长度处理。当n为偶数的时候是不可能存在最后的centralIndex的,当n为奇数的时候,最中间的那一个位置的index怎么求(n/2)。

标签:matrix,螺旋,int,initIndex,矩阵,LeetCode59,++,initNum
From: https://www.cnblogs.com/whitePuPigeon/p/17766427.html

相关文章

  • 矩阵优化dp
    都快csps了,还什么都不会的菜鱼(我估计着马上就可以改了这句话了,成了都快noip了)矩阵我们要用矩阵优化dp,首先要知道矩阵是个什么东西(感觉其实可以不用知道)。矩阵的很多定义啥的都可以选择去oi-wiki上去进行学习。很简单的一堆定义。读者自学不难,这里就不多赘述。矩阵加法就是将......
  • OpenGL入门——矩阵变换与坐标系统
    一、OpenGL的数学库GLM向量和矩阵的运算就不作说明了,直接介绍OpenGL中如何使用矩阵变换。GLM(官网:OpenGLMathematics(g-truc.net))是OpenGL Mathematics的缩写,它是一个只有头文件的库,也就是说只需包含对应的头文件就行了,不用链接和编译。把头文件的根目录复制到项目的includes......
  • 行列式与矩阵树定理
    定义定义矩阵的行列式:\[\detA=\sum_{\sigma}(-1)^{\tau(\sigma)}\prod_{i=1}^nA_{i\sigma_i}\]\(\tau(\sigma)\)是原排列的逆序对数。性质:若矩阵的某一行或某一列全为\(0\),则行列式为\(0\)。\(\detA=\detA^T\)。交换\(A\)的两行或两列,行列式取反。某一行或某一......
  • python_两两比较计算相似矩阵
    距离矩阵余弦距离矩阵余弦距离使用两个向量夹角的余弦值作为衡量两个个体间差异的大小。相比欧氏距离,余弦距离更加注重两个向量在方向上的差异点集内或矩阵内两两元素之间的距离矩阵##简单使用两重循环defcompute_squared_EDM_method(X):#获得矩阵都行和列,因为是行向......
  • 代码随想录第二天|977.有序数组的平方 ,209.长度最小的子数组 ,59.螺旋矩阵II
    977有序数组的平方题目链接:https://leetcode.cn/problems/squares-of-a-sorted-array/思路:双指针(实际是三指针),两个找最大值,一个确定平方后的位置。209.长度最小的子数组题目链接:https://leetcode.cn/problems/minimum-size-subarray-sum/思路:很像双指针,一个指向子数组开头,一......
  • 【noip赛前20天冲刺集训 day3】矩阵挑战
    NOIP比赛前的冲刺训练-第3天:矩阵挑战问题描述您有一个n×m矩阵,行编号从0到n−1,列编号从0到m−1。最初,第i行第j列的元素是i*m+j。系统支持三种类型的操作:交换两行。交换两列。交换两个特定的元素。任务是确定执行q次操作后矩阵的状态。输入格式为了最小化输......
  • MATLAB矩阵分析
    一、矩阵的基础知识closeall;clearall;clc;%%改变矩阵尺寸a=eye(3);a(2,4)=3;%添加第四列,第二行元素为3,其余为0a(:,4)=3;%添加第四列,元素都是3a(2,:)=[];%删除第二行a(:,2)=[];%删除第二列b=a(1:end);%将矩阵变为行向量,以列为顺序,end表示最后一个元素%%改变矩阵形状......
  • 矩阵连乘问题,生成需要的矩阵
      任务是这样子的:我们先完成txt文本矩阵的准备,大概做了50个矩阵; 代码如下:#include <iostream>#include <fstream>#include <vector>#include <random>#include <string>#include <windows.h> // 包含 Windows API 头文件// 创建文件夹(仅适用于 Window......
  • 【算法】国庆加班,火锅与Linq.AddRange的奇妙螺旋
    在国庆假期的一个傍晚,小悦正在家中享受火锅美食。她嘴里咀嚼着鲜嫩的牛肉,脸上洋溢着满足的微笑。突然,手机铃声响起,打破了这温馨的氛围。她拿起手机一看,是公司打来的电话。“小悦,有个紧急的项目需要处理,你能来公司加一下班吗?”电话那头传来领导焦急的声音。小悦顿时嘟起嘴,不太情......
  • 矩阵键盘的基本操作
    矩阵键盘的基本操作1、矩阵键盘的扫描思想与独立按键不同的是,按键的两个引脚都分别连接的单片机的I/O端口,一个作为行信号,另外一个作为列信号。我们以4X4的矩阵键盘为例,试着探讨其工作方式和扫描思路。在上面的矩阵键盘中,要识别出黄色按键的按下状态,应该怎么做呢?对于矩阵键盘,......