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

相关文章

1_Image和Matrix的使用

参考博文: https://www.cnblogs.com/bomo/archive/2013/03/28/2986573.html

leetcode刷题(93)——213. 打家劫舍 II

你是一个专业的小偷,计划偷窃沿街的房屋,每间房内都藏有一定的现金。这个地方所有的房屋都围成一圈,这意味着第一个房屋和最后一个房屋是紧挨着的。同时,相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警。 给定一个代表每个房屋存放金额的非负整数数组,计算你在不触动警报装置的情况下,能够偷窃到的最高金额。 示例 1: 输入: [2,3,2]输出: 3解释:

Reshape the Matrix问题及解法

问题描述: In MATLAB, there is a very useful function called 'reshape', which can reshape a matrix into a new one with different size but keep its original data. You're given a matrix represented by a

POJ 3233 Matrix Power Series 矩阵快速幂求A+A2+A3+…+Ak

题意 :给出n k m 和一个n*n的矩阵A 求A + A2 +A3 + … + Ak 参考http://blog.csdn.net/wangjian8006/article/details/7868864 构造矩阵很重要啊!!! 弱菜不会啊 #include <cstdio>#include <cstring>const int mod = 10000;const int maxn

Matrix->Matrix工具类获取Matrix的平移、缩放、错切数值

// 传入矩阵,获取矩阵数值class MatrixValues(matrix: Matrix) {val scaleX: Floatval scaleY: Floatval transX: Floatval transY: Floatval skewX : Float val skewY : Floatinit {val fromValues = FloatArray(9)matrix.g

js算法 计算每一列的平均值 求matrix数组对应列的平均值 组成一个新的数组 matrix数组有6行 如果某一行里的值是0则不纳入平均的分母里

let matrix = [[18.95, 21.1, 0, 23, 0, 0, 0],[19, 25.3, 24.64, 0, 0, 0, 21.24],[22.18, 24.5, 20, 0, 26, 0, 0],[18.41, 19.05, 22.41, 27.67, 17, 0, 0],[14.86, 19.31, 0, 19.4, 18.71, 0, 25.04],[18.93, 19.

稀疏矩阵coo_matrix、csr_matrix

coo_matrix 内存占用比csr_matrix少,易手工构建 例如: data即元素,row,col分别是稀疏矩阵中元素的坐标位置 >>> import numpy as np>>> data = np.array([4,5,7,9])>>> dataarray([4, 5, 7, 9])>>> row = np.array([0,3,1,0])>>> rowarray([0

day28回溯算法part04| 93.复原IP地址 78.子集 90.子集II

**93.复原IP地址 ** 本期本来是很有难度的,不过 大家做完 分割回文串 之后,本题就容易很多了 题目链接/文章讲解 | 视频讲解 class Solution {public:vector<string> result;// pointNum记录加入的点的数量,其等于3的时候停止void backtracking(string& s, int startindex, int po

CF279A Point on Spiral 题解

解题思路 按照题目中的规律画出来的图片如下: 那么,我们直接根据规律判断当前查询的节点在那一条线段上就可以了。易得,当前的基础转向次数为 max ( ∣ x ∣ − 1 , ∣ y ∣ − 1 ) × 4 (|x|-1,|y|-1)\times 4 (∣x∣−1,∣y∣−1)×4,那么加上一个在当前周期内部的转向次数就可以了。 AC 代码 #include<bits/stdc++.h>

B. Inna and New Matrix of Candies

Inna likes sweets and a game called the "Candy Matrix". Today, she came up with the new game "Candy Matrix 2: Reload". The field for the new game is a rectangle table of size n × m. Each line of the