54. 螺旋矩阵

题目描述

给定一个包含 m x n 个元素的矩阵(m 行, n 列),请按照顺时针螺旋顺序,返回矩阵中的所有元素。

示例 1:

输入:

[

[ 1, 2, 3 ],

[ 4, 5, 6 ],

[ 7, 8, 9 ]]

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

示例 2:

输入:

[

[1, 2, 3, 4],

[5, 6, 7, 8],

[9,10,11,12]]

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

算法

外一层,里一层的递归插入要返回的向量中。

执行递归插入操作的函数是void insert_to_vec(vector<vector<int>>& matrix, int left_top_row, int left_top_col, int right_bottom_row, int right_bottom_col)

它包含5个参数:

1. 矩阵

2. 左上角的行

3. 左上角的列

4. 右下角的行

5. 右下角的列

left_top_row > right_bottom_row || left_top_col > right_bottom_col是递归的中止条件,

left_top_row == right_bottom_rowleft_top_col == right_bottom_col是特殊边界,

整个插入按照左上到右上,右上到右下,右下到左下,左下到左上的流程走完,

然后进行里一层的插入,即调用insert_to_vec(matrix, left_top_row+1, left_top_col+1, right_bottom_row-1, right_bottom_col-1);.

代码

class Solution {
public:
    // 这是要返回的答案
    vector<int> ansVec;
    vector<int> spiralOrder(vector<vector<int>>& matrix) {
        // row是矩阵的行数
        int row = matrix.size();

        if (row == 0)
            return ansVec;

        if (row == 1)
            return matrix[0];

        // col是矩阵的列数
        int col = matrix[0].size();

        if (col == 1)
        {
            for (int j = 0; j < row; j++)
                ansVec.push_back(matrix[j][0]);
            return ansVec;
        }

        insert_to_vec(matrix, 0, 0, row-1, col-1);
        return ansVec;
    }

    void insert_to_vec(vector<vector<int>>& matrix, int left_top_row, int left_top_col, int right_bottom_row, int right_bottom_col)
    {
        if (left_top_row > right_bottom_row || left_top_col > right_bottom_col)
            return;

        if (left_top_row == right_bottom_row)
        {
            for (int i = left_top_col; i <= right_bottom_col; i++)
                ansVec.push_back(matrix[left_top_row][i]);
            return;
        }

        if (left_top_col == right_bottom_col)
        {
            for (int i = left_top_row; i <= right_bottom_row; i++)
                ansVec.push_back(matrix[i][left_top_col]);
            return;
        }

        for(int i = left_top_col; i <= right_bottom_col; i++)
            ansVec.push_back(matrix[left_top_row][i]);

        for(int i = left_top_row + 1; i <= right_bottom_row; i++)
            ansVec.push_back(matrix[i][right_bottom_col]);

        for(int i = right_bottom_col - 1; i >= left_top_col; i--)
            ansVec.push_back(matrix[right_bottom_row][i]);

        for(int i = right_bottom_row - 1; i > left_top_row; i--)
            ansVec.push_back(matrix[i][left_top_col]);

        insert_to_vec(matrix, left_top_row+1, left_top_col+1, right_bottom_row-1, right_bottom_col-1);
    }
};

原文地址:https://www.cnblogs.com/shayue/p/10360865.html

时间: 2024-08-08 05:00:22

54. 螺旋矩阵的相关文章

[leetcode] 54. 螺旋矩阵

54. 螺旋矩阵 模拟 还是用老技巧,用一个dx来描述某个方向的i,j坐标变换情况. int[][] dx = {{0, 1}, {1, 0}, {0, -1}, {-1, 0}}; 如果按题目中的例子来看的话,分别表示向左,下,右,上走时,i,j坐标应该如何变换 class Solution { public List<Integer> spiralOrder(int[][] matrix) { int m = matrix.length; List<Integer> ans =

代码题(37)— 螺旋矩阵

1.54. 螺旋矩阵 给定一个包含 m x n 个元素的矩阵(m 行, n 列),请按照顺时针螺旋顺序,返回矩阵中的所有元素. 示例 1: 输入: [ [ 1, 2, 3 ], [ 4, 5, 6 ], [ 7, 8, 9 ] ] 输出: [1,2,3,6,9,8,7,4,5] 示例 2: 输入: [ [1, 2, 3, 4], [5, 6, 7, 8], [9,10,11,12] ] 输出: [1,2,3,4,8,12,11,10,9,5,6,7]    思想:用左上和右下的坐标定位出一次要旋

LeetCode:螺旋矩阵【54】

LeetCode:螺旋矩阵[54] 题目描述 给定一个包含 m x n 个元素的矩阵(m 行, n 列),请按照顺时针螺旋顺序,返回矩阵中的所有元素. 示例 1: 输入: [ [ 1, 2, 3 ], [ 4, 5, 6 ], [ 7, 8, 9 ] ] 输出: [1,2,3,6,9,8,7,4,5] 示例 2: 输入: [ [1, 2, 3, 4], [5, 6, 7, 8], [9,10,11,12] ] 输出: [1,2,3,4,8,12,11,10,9,5,6,7] 题目分析 这道题简直

Leetcode 54:Spiral Matrix 螺旋矩阵

54:Spiral Matrix 螺旋矩阵 Given a matrix of m x n elements (m rows, n columns), return all elements of the matrix in spiral order. 给定一个包含 m x n 个元素的矩阵(m 行, n 列),请按照顺时针螺旋顺序,返回矩阵中的所有元素. Example 1: Input: [ [ 1, 2, 3 ], [ 4, 5, 6 ], [ 7, 8, 9 ] ] Output: [1

1050. 螺旋矩阵(25)

本题要求将给定的N个正整数按非递增的顺序,填入“螺旋矩阵”.所谓“螺旋矩阵”,是指从左上角第1个格子开始,按顺时针螺旋方向填充.要求矩阵的规模为m行n列,满足条件:m*n等于N:m>=n:且m-n取所有可能值中的最小值. 输入格式: 输入在第1行中给出一个正整数N,第2行给出N个待填充的正整数.所有数字不超过104,相邻数字以空格分隔. 输出格式: 输出螺旋矩阵.每行n个数字,共m行.相邻数字以1个空格分隔,行末不得有多余空格. 输入样例: 12 37 76 20 98 76 42 53 95

编程题之打印二维螺旋矩阵

当size=4时, 二维螺旋矩阵如下图所示: 规律总结 可以把这个二维矩阵看成一层套一层,如上图所示,1->4->7->10->12为第零层, 13->14->15->16为第一层,所以当size=4时,总共有两层.规律如下: 可分层数为:若size为偶数,层数=size/2, 若为奇数,则层数=(size+1)/2; 第n层一个方向上的数字的数量为:size-2*n; 这是因为第零层的一个方向上数字的数量就是size, 而第一层是size-2,...第n层就是s

NOIP2014-普及组复赛-第三题-螺旋矩阵

题目描述 Description 一个n行n列的螺旋矩阵可由如下方法生成: 从矩阵的左上角(第1行第1列)出发,初始时向右移动:如果前方是未曾经过的格子,则继续前进,否则右转:重复上述操作直至经过矩阵中所有格子.根据经过顺序,在格子中依次填入1, 2, 3, ... , n,便构成了一个螺旋矩阵.2 下图是一个n = 4 时的螺旋矩阵. 1     2     3     4 12    13    14    5 11    16    15    6 10     9     8     7

Java实现螺旋矩阵

螺旋矩阵是指一个呈螺旋状的矩阵,它的数字由第一行开始到右边不断变大,向下变大,向左变大,向上变大,如此循环.如下图, 故,实现螺旋矩阵的思路也就跟上图所示,依次从外层向里层循环,当n为偶数时,循环n/2次:n为奇数时,循环n/2+1次.具体实现看以下代码: import java.util.Scanner; public class Snake { public void snake(int n) { int[][] data = new int[n][n]; int intA; int val

由里向外的螺旋矩阵

输出N阶螺旋矩阵,如N=5时 17 16 15 14 13 18   5  4   3  12 19   6  1   2  11 20  7   8   9  10 21 22 23 24 25 思路如下: 从二维数组的第(N-1,N-1)个元素开始,分别对矩阵最外层的四条边进行赋值操作,起始值是N*N,依次递减. 1 #include <stdio.h> 2 #include <string.h> 3 #include <stdlib.h> 4 #include &