首页 > 其他分享 >59. 螺旋矩阵 II

59. 螺旋矩阵 II

时间:2023-12-14 13:44:06浏览次数:31  
标签:59 bottom int 矩阵 II num result row left

题目:

59. 螺旋矩阵 II

要求:

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

答案:

两种解法:

一种用计算机模拟顺时针旋转的效果,这种方法看起来容易,做起来并没有那么容易,我开始就用这个思路做的,结果发现写不出来,看了下题解,才写出来,我写不出来的点就是在旋转的地方没有做到,我想着每一个点都是一种情况,没有总结出通用的旋转情况,并且没有使用下一个位置来做旋转,而是判断当前位置来做旋转,这是其一;其二是每一个定点旋转其实规律是相同的,官方题解给出了一个二维数组就非常巧妙,单独定义了一个旋转点来作为二维数组的横坐标,横坐标就分别代表了向右、向下、向左、向上,思路简单,代码不好写呀。

第二种是层级思维,每次遍历一层,也就是最外面一层,这个时候不需要考虑边界,只要定义四个定点就行,在每遍历一层,修改四个定点就可以,四个定点分别是每一层开始的横坐标(left)、纵坐标(top)、结束的横坐标(right)、结束的纵坐标(bottom),其实开始的横纵坐标一定是相等的,用一个变量也可以,方便理解还是分开表示,这样每遍历一层,坐标变化是 left + 1top + 1right - 1bottom - 1 ,循环结束的条件就是 left ≤ righttop ≤ bottom ,为什么要相等呢?因为奇数的时候,最中间的位置横纵索引是相同的。至于在赋值的时候什么时候给边界赋值,就是 for 循环上添加等号就可以,不可重复给同一个位置赋值,这点很重要。

/**
 * 遇到边界或者访问过的元素,就顺时针转动,关键是代码怎么写,如何确定边界很关键。
 * 这里声明了一个二维数组确定下一个位置,声明一个变量用来确定方向,为什么要确定下一个位置,因为要根据下一个位置来确定是不是要转向,
 * 也就是下一个位置如果处于边界或者已经访问过,则顺时针转向
 *
 * @param n 二维数组的长度
 * @return 二维数组
 */
public static int[][] generateMatrix(int n) {
    int[][] result = new int[n][n];
    // 四个方向,分别代表了右、下、左、上
    int[][] direct = new int[][] {{0, 1}, {1, 0}, {0, -1}, {-1, 0}};
    // 代表了方向,因为是四个方向,所以和 4 取余
    int steering = 0;
    // 初始化行、列
    int num = 1, row = 0, col = 0;
    while (num <= n * n) {
        result[row][col] = num;
        num++;
        // 确定下一个位置,并不是真实的下一个位置,而是根据当下的情况确定下一个位置,用于判断是否是边界或者是否已经访问过
        int nextRow = row + direct[steering][0], nextCol = col + direct[steering][1];
        // 如果是边界或者已经访问过, 则顺时针旋转到下一个方向
        if (nextRow < 0 || nextRow >= n || nextCol < 0 || nextCol >= n || result[nextRow][nextCol] != 0) {
            steering = (++steering) % 4;
        }
        // 确定真实的下一个位置
        row = row + direct[steering][0];
        col = col + direct[steering][1];
    }
    return result;
}

/**
 * 按层遍历,确定每一层的四个角,并且每一层都是先从左上到右上,从右上到右下,从右下到左下,从左下到左上,形成循环
 *
 * @param n 二维数组的长度
 * @return 二维数组
 */
public static int[][] generateMatrix2(int n) {
    int[][] result = new int[n][n];
    int num = 1;
    int left = 0, right = n - 1, top = 0, bottom = n - 1;
    while (left <= right && top <= bottom) {
        for (int col = left; col <= right; col++) {
            result[left][col] = num;
            num++;
        }
        for (int row = top + 1; row <= bottom; row++) {
            result[row][right] = num;
            num++;
        }
        for (int col = right - 1; col >= left; col --) {
            result[bottom][col] = num;
            num++;
        }
        for (int row = bottom - 1; row > top; row --) {
            result[row][left] = num;
            num++;
        }
        left ++;
        right --;
        top ++;
        bottom --;
    }
    return result;
}

标签:59,bottom,int,矩阵,II,num,result,row,left
From: https://www.cnblogs.com/wadmwz/p/17901004.html

相关文章

  • CF1592F2 Alice and Recoloring 2
    题意给定一个矩阵,有两种颜色\(W\)和\(B\)。你可以花\(1\)的代价反转一个包含\((1,1)\)的矩阵。你可以花\(3\)的代价反转一个包含\((n,1)\)的矩阵。你可以花\(4\)的代价反转一个包含\((1,m)\)的矩阵。你可以花\(2\)的代价反转一个包含\((n,m)\)的矩阵......
  • P1527 [国家集训队] 矩阵乘法
    题意给定一个矩阵,每次询问子矩阵的第\(k\)大。Sol考虑把莫队扔到二维上来做。发现复杂度变为:\(O(n^2q^{\frac{3}{4}})\)。卡卡常就过了。Code#include<iostream>#include<algorithm>#include<cstdio>#include<array>#include<cmath>#include<vector>#i......
  • 在 IIS10 中设置上传大小限制
    在IIS10中设置上传大小限制编写人:左丘文2023-12-13各位,好久没有更新园子的相关文档了,外面的世界早已千变万化,但我解决问题的心依旧,作为程序员的我,发现问题就想mark一下,在此做个小结,分享出来,以供参考。有兴趣的同学,可以一同探讨与学习一下,否则就略过吧。根据网上查找的相关办......
  • [LeetCode] LeetCode92. 反转链表II
    题目描述思路:同LeetCode25.K个一组翻转链表因为涉及到可能链表的头节点会改变,所以设置dummy节点先走left-1步到达left的左边一个节点查看后面是否存在right-left+1个节点先翻转内部节点指向right-left次再翻转外部节点方法一:/***Definitionforsingly-lin......
  • 解决 OSError: [WinError -1066598274] Windows Error 0xc06d007e (xjl456852原创)
    异常OSError:[WinError-1066598274]WindowsError0xc06d007e或Processfinishedwithexitcode-1066598274(0xC06D007E)遇到问题:程序在调用PCA方法时,出现上述异常.这种PCA方法使用sklearn中的依赖包.我尝试了pip和mamba重新安装多个依赖包之后问题得到解决(只选择一......
  • 【常见问题】Python报错SyntaxError: Non-ASCII character '\\xe7' in file
    错误原因:windows默认编码格式是GBK,macOS,linux是utf-8。当使用windows且代码内有GBK不支持的字符集的时候,就会报错。解决方法:方法一在python文件的顶部加上编码格式#-*-coding:utf-8-*-方法二在python3.7以及之后,使用utf-8模式https://peps.python.org/pep-0540/pyt......
  • [CF1592F2] Alice and Recoloring 2
    题目链接操作2和3可以用另两个代替,没有任何用。设W表示\(t_{i,j}=0\),B表示\(t_{i,j}=1\)考虑差分。设\(t_{i,j}=s_{i,j}\opluss_{i+1,j}\opluss_{i,j+1}\opluss_{i+1,j+1}\),那么目标变为把$t4数组清0那么操作1是把单点翻转,操作4是对于一个\(x,y(x<n,y<m)......
  • 113. 路径总和 II(中)
    目录题目题解:回溯题目给你二叉树的根节点root和一个整数目标和targetSum,找出所有从根节点到叶子节点路径总和等于给定目标和的路径。题解:回溯classSolution:defpathSum(self,root:Optional[TreeNode],targetSum:int)->List[List[int]]:res=[......
  • [QOJ1359] Setting Maps
    题目链接\(k=1\)的时候显然是最小割。把一个点\(u\)拆成两个点,中间连流量为\(c_u\)的边。那么考虑扩展到\(k\)更大的情况。把上图的每个入点和出点都拆成\(k\)个。把节点\(u\)第\(i\)层入点和第\(i+1\)层入点连接,再把第\(i\)层入点和所有满足\(j>i\)层的出......
  • ASCII编码
    一、ASCII编码简介ASCII(AmericanStandardCodeforInformationInterchange,美国标准信息交换代码)是一种基于拉丁字母的电脑编码系统,主要用于显示现代英语和其他西欧语言。它是现今最通用的单字节编码系统,涵盖了128个字符。Ascii编码解码--一个覆盖广泛主题工具的高效在线......