题目链接:https://leetcode.com/problems/spiral-matrix/description/

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

Example 1:

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

Example 2:

Input:
[
[1, 2, 3, 4],
[5, 6, 7, 8],
[9,10,11,12]
]
Output: [1,2,3,4,8,12,11,10,9,5,6,7]

思路:

  • 题目要求给定一个m * n的矩阵,按螺旋式的方式将其存入一个容器中
  • 针对此类型的题目,其实就是找规律,最好的方法还是:观察!观察!观察!重要的事说三遍!!!
  • 下面说下思路:
  • 为了便于分析,将每次扫描矩阵边的四个角分别命名为:left_Up、right_Up、right_Down、left_Down;

  • 观察可知一个完整的遍历顺序为:left_Up->right_Up->right_Down->left_Down->left_Up......,依次类推,只不过下一次遍历的范围变小了;
  • 当前要解决的问题主要有如下两个:
    1. 是如何控制遍历的次数(即需要遍历几次即可遍历完整个m*n矩阵);
    2. 每一次遍历的各个遍历方向的遍历范围如何控制。
  • 通过观察发现,遍历的次数 loop = min(m, n) / 2 + min(m, n) % 2; 因为每次遍历都会遍历完成整个矩阵的两行、两列(这里的两行、两列仅仅只是指范围),而决定循环次数loop的是矩阵行数、列数中较小的那一个。
  • 用(i, j)的形式表示矩阵上每一个元素的坐标(i:表示行数; j:表示列数);i = 0, j = 0(i, j初始化为0), m: 表示矩阵的行数,n:表示矩阵的列数 。
  • 初始化:left_Up = 0, right_Up = n - j, right_Down = m - i, left_Down = 0; 矩阵从左上角left_Up开始出发
  • left_Up -> right_Up的遍历过程中,即从坐标(i, left_Up)-> (i, right_Up)的过程;i不变,left_Up在变化, 令left_Up = j,  left_Up < right_Up即为循环终止条件;
  • right_Up -> right_Down的遍历过程中,即从坐标(i+1, left_Up) -> (right_Down, left_Up)的过程;left_Up不变,令right_Up = i + 1, right_Up < right_Down即为循环终止条件;
  • right_Down -> left_Down的遍历过程中,即从坐标(right_Up, left_Up-1) -> (right_Up, left_Down)的过程;right_up不变,令right_Down = left_Up-1, right_Dwon >= j即为循环终止条件;
  • left_Down -> left_Up的遍历过程中, 即从坐标(right_Up-1, right_Down) -> (++i, right_Down)的过程;right_Down不变,令left_Down = right_Up-1, left_Down >= i即为循环终止条件;

  注意:在循环遍历过程中也要判断元素个数,确定是否遍历完成;因为可能最后一次遍历只有四个方向的遍历(left_Up->right_Up->right_Down->left_Down->left_Up......)中的某几个方向,即一次不完整的遍历。

编码如下

 class Solution {
public:
vector<int> spiralOrder(vector<vector<int>>& matrix) {
vector<int> ivtr;
if (matrix.size() == )
{
return ivtr;
} int m = matrix.size(); // 矩阵行
int n = matrix[].size(); // 矩阵列 int i = , j = ; // (i, j)
int loop = min(m, n) / + min(m, n) % ; while (loop-- > )
{
int left_Up = , right_Up = n - j, right_Down = m - i, left_Down = ;
// 左上角到右上角遍历
for (left_Up = j; left_Up < right_Up && ivtr.size() < m * n; ++left_Up)
{
ivtr.push_back(matrix[i][left_Up]);
}
left_Up--; // 右上角到右下角遍历
for (right_Up = i + ; right_Up < right_Down && ivtr.size() < m * n; ++right_Up)
{
ivtr.push_back(matrix[right_Up][left_Up]);
}
right_Up--; // 从右下角到左下角遍历
for (right_Down = left_Up - ; right_Down >= j && ivtr.size() < m * n; --right_Down)
{
ivtr.push_back(matrix[right_Up][right_Down]);
}
right_Down++; // 从左下角到左上角遍历
++i;
for (left_Down = right_Up - ; left_Down >= i && ivtr.size() < m * n; --left_Down)
{
ivtr.push_back(matrix[left_Down][right_Down]);
}
++j; } return ivtr;
}
};

054. Spiral Matrix的更多相关文章

  1. Java for LeetCode 054 Spiral Matrix

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

  2. 054 Spiral Matrix 旋转打印矩阵

    给出一个 m x n 的矩阵(m 行, n 列),请按照顺时针螺旋顺序返回元素.例如,给出以下矩阵:[ [ 1, 2, 3 ], [ 4, 5, 6 ], [ 7, 8, 9 ]]应该返回 [1,2, ...

  3. Java for LeetCode 059 Spiral Matrix II

    Given an integer n, generate a square matrix filled with elements from 1 to n2 in spiral order. For ...

  4. [LeetCode] Spiral Matrix II 螺旋矩阵之二

    Given an integer n, generate a square matrix filled with elements from 1 to n2 in spiral order. For ...

  5. [LeetCode] Spiral Matrix 螺旋矩阵

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

  6. LeetCode - 54. Spiral Matrix

    54. Spiral Matrix Problem's Link ------------------------------------------------------------------- ...

  7. 【leetcode】Spiral Matrix II

    Spiral Matrix II Given an integer n, generate a square matrix filled with elements from 1 to n2 in s ...

  8. 【leetcode】Spiral Matrix II (middle)

    Given an integer n, generate a square matrix filled with elements from 1 to n2 in spiral order. For ...

  9. 59. Spiral Matrix && Spiral Matrix II

    Spiral Matrix Given a matrix of m x n elements (m rows, n columns), return all elements of the matri ...

随机推荐

  1. 关于TAILQ链表节点删除问题

    这两天偶遇无线驱动中对链表节点删除的问题,刚开始修改代码的时候并没有很在意,把TAILQ链表当成一般的链表来处理,虽然修改以后没有出现段错误,但是后面review代码的时候发现,这样改不对.后面花了点 ...

  2. Java常用类(二) Scanner类和大数类

    二.Scanner类 有C系语言基础的可能都比较熟悉scanf("%d",&a);和cin>>a;这种代码,也打开了程序交互的第一道门.因此,这些程序员开始学J ...

  3. Java-DatabaseConnectionPool工具类

    package org.zxjava.test; import java.sql.Connection; import java.sql.DatabaseMetaData; import java.s ...

  4. ThreadPoolTaskExecutor使用详解(转)

    当并发或者异步操作,都会用到ThreadPoolTaskExecutor.现在对线程池稍作理解. /*** *@Auth dzb *@Date 22:29 2018/8/29 *@Descriptio ...

  5. 导出excel 各 cvs 的方法

    public function orderExcelExport($data,$filename='simple.xls'){ ini_set('max_execution_time', '0'); ...

  6. jquery image选择器 语法

    jquery image选择器 语法 作用::image 选择器选取类型为 image 的 <input> 元素.无锡大理石测量平台 语法:$(":image") jq ...

  7. Vue 工程化最佳实践

    目录结构 总览   api 目录用于存放 api 请求,文件名与模型名称基本一致,文件名使用小驼峰,方法名称与后端 restful 控制器一致.   enums 目录存放 常量,与后端的常量目录对应 ...

  8. [spring cloud] [error] java.lang.IllegalStateException: Only one connection receive subscriber allowed.

    前言 最近在开发api-gateway的时候遇到了一个问题,网上能够找到的解决方案也很少,之后由公司的大佬解决了这个问题.写下这篇文章记录一下解决方案.希望可以帮助到更多的人. 环境 java版本:8 ...

  9. HDU 5810 Balls and Boxes ——(数学,概率,方差)

    官方题解看不太懂,参考了一些人的博客以后自己证明如下: 其中D(X)和E(X)的公式如下(参考自百度百科): 其中 p = 1 / m .(这是每一个单独事件发生的概率期望,在这里单独事件指的是一个球 ...

  10. DB 分库分表(4):多数据源的事务处理

    系统经sharding改造之后,原来单一的数据库会演变成多个数据库,如何确保多数据源同时操作的原子性和一致性是不得不考虑的一个问题.总体上看,目前对于一个分布式系统的事务处理有三种方式:分布式事务.基 ...