93. Spiral Matrix

2024-05-12 01:08
文章标签 93 matrix spiral

本文主要是介绍93. Spiral Matrix,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

Given a matrix of m x n elements (m rows, n columns), return all elements of the matrix in spiral order.

For example,
Given the following matrix:

[[ 1, 2, 3 ],[ 4, 5, 6 ],[ 7, 8, 9 ]
]

You should return [1,2,3,6,9,8,7,4,5].


题目:输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字。

分析:依次找到矩阵最外面一圈还没有被找到的元素,每一圈最左上角的元素坐标是(start,start),控制找的圈数的控制条件,start*2 < rows && start*2 <cols。

不能有等号的原因是比如有4列的时候列的坐标为0,1,2,3,最多start找到1,而不能是到2。

针对找到的某圈元素进行处理的时候,分为四步:

       第一步:从左打印到右。也就是从这一圈的左上角打印到这一圈的右上角。行坐标start不变,列坐标由start到endCol;

       第二步:从上打印到下,前提是至少有两行才可以endRow > start。也就是从这一圈的右上角打印到这一圈的右下角。行坐标由start+1到endRow,列左边endCol不变;

        第三步:从右打印到左,前提是至少有两行两列才可以endRow>start && endCol > start。也就是从这一圈的右下角打印到这一圈的坐下角。行坐标endRow不变,列坐标由endCol-1到start;

        第四步:从下打印到上,前提是至少有三行两列才可以endRow > start+1 && endCol>start。也就是从这一圈的左下角打印到这一圈的左上角。行坐标由endRow-1到start+1,列坐标start不变。

       找到每一圈的初始坐标之后,进去依次判断打印的四步,满足哪一步就打印哪一步上的元素。


/*** 顺时针打印给定的二维数组。 * 依次找到矩阵最外面一圈还没有被找到的元素,每一圈最左上角的元素坐标是(start,start),控制找的圈数的控制条件,start*2 < rows && start*2 <cols。* 不能有等号的原因是比如有4列的时候列的坐标为0,1,2,3,最多start找到1,而不能是到2.* 针对找到的某圈元素进行处理的时候,分为四步:* 第一步:从左打印到右。也就是从这一圈的左上角打印到这一圈的右上角。行坐标start不变,列坐标由start到endCol;* 第二步:从上打印到下,前提是至少有两行才可以endRow > start。也就是从这一圈的右上角打印到这一圈的右下角。行坐标由start+1到endRow,列左边endCol不变;* 第三步:从右打印到左,前提是至少有两行两列才可以endRow>start && endCol > start。也就是从这一圈的右下角打印到这一圈的坐下角。行坐标endRow不变,列坐标由endCol-1到start;* 第四步:从下打印到上,前提是至少有三行两列才可以endRow > start+1 && endCol>start。也就是从这一圈的左下角打印到这一圈的左上角。行坐标由endRow-1到start+1,列坐标start不变。* */public List<Integer> spiralOrder(int[][] matrix) {List<Integer> list = new ArrayList<Integer>();int rows = matrix.length;/*记录矩阵的行数*//*如果矩阵只有0行,则返回*/if(rows == 0){return list;}int cols = matrix[0].length;/*记录矩阵的列数*/int start = 0;/*每次找出矩阵中最外面还没有被找到的那一圈元素,每一圈的开始坐标是(start,start)*/while(start*2 < rows && start*2 <cols){int endRow = rows-1-start; //每一圈的结束行坐标int endCol = cols-1-start;/*第一步打印:从左到右,行坐标start不变,列坐标由start到endCol*/for(int j = start;j<=endCol;j++){list.add(matrix[start][j]);}if(endRow > start){/*第二步打印:从上到下,行坐标由start+1到endRow-1,列左边endCol不变*/for(int i = start+1;i<=endRow;i++){list.add(matrix[i][endCol]);}}if(endRow>start && endCol > start){ /*第三步打印:从右到左,行坐标endRow不变,列坐标由endCol-1到start*/for(int j = endCol-1;j>=start;j--){list.add(matrix[endRow][j]);}}if(endRow > start+1 && endCol>start){ /*第四步打印:从下到上,行坐标由endRow-1到start+1,列坐标start不变*/for(int i = endRow-1;i>=start+1;i--){list.add(matrix[i][start]);}}start++;}return list;}


这篇关于93. Spiral Matrix的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/981172

相关文章

[论文笔记]LLM.int8(): 8-bit Matrix Multiplication for Transformers at Scale

引言 今天带来第一篇量化论文LLM.int8(): 8-bit Matrix Multiplication for Transformers at Scale笔记。 为了简单,下文中以翻译的口吻记录,比如替换"作者"为"我们"。 大语言模型已被广泛采用,但推理时需要大量的GPU内存。我们开发了一种Int8矩阵乘法的过程,用于Transformer中的前馈和注意力投影层,这可以将推理所需

代码随想录刷题day24丨93.复原IP地址 ,78.子集 , 90.子集II

代码随想录刷题day24丨93.复原IP地址 ,78.子集 , 90.子集II 1.题目 1.1复原IP地址 题目链接:93. 复原 IP 地址 - 力扣(LeetCode) 视频讲解:回溯算法如何分割字符串并判断是合法IP?| LeetCode:93.复原IP地址_哔哩哔哩_bilibili 文档讲解:https://programmercarl.com/0093.%E5%A4%8

73. Set Matrix Zeros

题目: 解答: 提供了两种解题思路: 第一种,使用两个数组,分别标记每一行、每一列是否有0的存在,然后再去更新二维数组。 第二种,使用两个变量brow,bcol分别标记第0行,第0列是否存在0,然后使用每一行、每一列的第一个单元存储是否该行、该列存在0. 代码: class Solution {public:// 方法一void setZeroes(vector<vector<i

Error: label vector and instance matrix must be double的解决方法

在使用uci下载的数据时,建模时出现这个错误的解决方法 首先现在UCI上面下载数据 然后右键另存为就行了。这样我们就从UCI里面下载到了训练数据 在matlab 点 导入数据,数据类型要记得选第二个, 如果选择最后一个table就会出现这个问题 最后附上代码 %%之前先import wine.date IMPORTED DATA 设为Numeric Matrix (数值矩

python 实现matrix exponentiation矩阵求幂算法

matrix exponentiation矩阵求幂算法介绍 矩阵求幂算法(Matrix Exponentiation)是一种通过利用矩阵乘法的结合律来高效地计算矩阵的幂的算法。这种方法特别适用于在算法竞赛和计算机科学领域中解决需要快速计算矩阵幂的问题,如求解线性递推关系、图论中的路径计数等。 基本思想 矩阵求幂算法的基本思想类似于整数快速幂算法(快速幂算法),通过递归或迭代的方式将矩阵幂的计

[LeetCode] 240. Search a 2D Matrix II

题:https://leetcode.com/problems/search-a-2d-matrix-ii/description/ 题目 Write an efficient algorithm that searches for a value in an m x n matrix. This matrix has the following properties: Integers i

[LeetCode] 566. Reshape the Matrix

题:https://leetcode.com/problems/reshape-the-matrix/description/ 题目 In MATLAB, there is a very useful function called ‘reshape’, which can reshape a matrix into a new one with different size but keep

UVa 11992 Fast Matrix Operations 线段树

UVa 11992 Fast Matrix Operations 题目大意:有一个r行c列的全0矩阵,支持三种操作: 1 x1 y1 x2 y2 v 子矩阵(x1,y1,x2,y2)的所有元素增加v(v > 0)。 2 x1 y1 x2 y2 v 子矩阵(x1,y1,x2,y2)的所有元素设为v(v > 0)。 3 x1 y1 x2 y2    查询子矩阵(x1,y1,x2,y2

【HDU】4965 Fast Matrix Calculation 矩阵快速幂

传送门:【HDU】4965 Fast Matrix Calculation 题目分析:因为比赛的时候写的太匆忙。。写的不堪入目,所以赛后重写了一次,顺便就贴一下了。 因为A*B=C,所以C^(N*N-1) = A*B*A*B*A*...*B*A*B,因为满足结合律所以变成A*( (B*A)^(N*N-2) )*B,因为中间得到的矩阵最大不超过K(K<=6),所以可以对中间的矩阵快速幂,然

01 Matrix

Input:[[0,0,0],[0,1,0],[1,1,1]]Output:[[0,0,0],[0,1,0],[1,2,1]] Given a matrix consists of 0 and 1, find the distance of the nearest 0 for each cell. The distance between two adjacent cells is 1.