LeetCode:Spiral Matrix - 螺旋输出矩阵中的元素

1、题目名称

Spiral Matrix(螺旋输出矩阵中的元素)

2、题目地址

https://leetcode.com/problems/spiral-matrix/

3、题目内容

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

中文:给出一个m行n列的矩阵,以螺旋顺序返回矩阵中的所有元素。

例如:现有矩阵如下:

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

则输出应为 [1, 2, 3, 6, 9, 8, 7, 4, 5]

4、解题方法1

一种方法是使用四个数字分别记录上下左右四个边界的位置,不断循环收窄这些边界,最终当两个边界重叠时,结束循环。

Java代码如下:

import java.util.LinkedList;
import java.util.List;

/**
 * @功能说明:LeetCode 54 - Spiral Matrix
 * @开发人员:Tsybius2014
 * @开发时间:2015年11月2日
 */
public class Solution {
    
    public List<Integer> spiralOrder(int[][] matrix) {

        LinkedList<Integer> linkedList = new LinkedList<Integer>();
        
        if (matrix == null || matrix.length == 0) {
            return linkedList;
        }
        
        //左右上下四个边界
        int left = 0;
        int right = matrix[0].length - 1;
        int top = 0;
        int bottom = matrix.length - 1;

        int i;
        while (true) {
            
            //上边,自左至右
            for (i = left; i <= right; i++) {
                linkedList.add(matrix[top][i]);
            }
            if (++top > bottom) {
                break;
            }
            
            //右边,自上至下
            for (i = top; i <= bottom; i++) {
                linkedList.add(matrix[i][right]);
            }
            if (left > --right) {
                break;
            }
            
            //下边,自右至左
            for (i = right; i >= left; i--) {
                linkedList.add(matrix[bottom][i]);
            }
            if (top > --bottom) {
                break;
            }
            
            //左边,自下至上
            for (i = bottom; i >= top; i--) {
                linkedList.add(matrix[i][left]);
            }
            if (++left > right) {
                break;
            }
            
        }
        
        return linkedList;
    }
}

5、解题方法2

另一种方法是预先指定好遍历四个边时的坐标增减方向,并在每次沿一个方向行进完毕后,计算出下个方向应行进的单位数。

Java代码如下:

import java.util.LinkedList;
import java.util.List;

/**
 * @功能说明:LeetCode 54 - Spiral Matrix
 * @开发人员:Tsybius2014
 * @开发时间:2015年11月2日
 */
public class Solution {
    
    public List<Integer> spiralOrder(int[][] matrix) {

        LinkedList<Integer> linkedList = new LinkedList<Integer>();
        
        if (matrix == null || matrix.length == 0) {
            return linkedList;
        }
        
        //行进方向
        int[][] direction = new int[][] {{0, 1}, {1, 0}, {0, -1}, {-1, 0}};
        
        //以初始点(0,0)的初始行进方向计算出的初始点前一个点的行列坐标
        int x = 0;
        int y = -1;
        
        //矩阵的行数和列数
        int m = matrix.length;
        int n = matrix[0].length;
        
        //counter决定了转动的具体方向
        int counter = 0;
        while (m > 0 && n > 0) {
            int k;
            //判断横向移动还是纵向移动
            if (counter % 2 == 0) {
                k = n;
                m--;
            } else {
                k = m;
                n--;
            }
            //沿一个方向进行移动
            while (k-- != 0) {
                x += direction[counter][0];
                y += direction[counter][1];
                linkedList.add(matrix[x][y]);
            }
            //调整方向
            counter = (counter + 1) % 4;
        }
        
        return linkedList;
    }
}

END

时间: 2024-10-27 13:01:25

LeetCode:Spiral Matrix - 螺旋输出矩阵中的元素的相关文章

[C++]LeetCode: 110 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]. 思路:我们来自己画一个螺旋线的行走轨迹

[Leetcode] 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]. 题意:以螺旋的方式,顺时针访问数组. 思路:按照遍

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

LeetCode: Spiral Matrix [058]

[题目] 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]. [题意] 螺旋输出MxN矩阵 [注意

LeetCode:Spiral Matrix I II

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]. 打印螺旋矩阵 逐个

LeetCode: Spiral Matrix II [058]

[题目] Given an integer n, generate a square matrix filled with elements from 1 to n2 in spiral order. For example, Given n = 3, You should return the following matrix: [ [ 1, 2, 3 ], [ 8, 9, 4 ], [ 7, 6, 5 ] ] [题意] 给定整数n, 将1,2,3...nxn个数按螺旋旋转的方式填入nxn的矩

LeetCode: Spiral Matrix II 解题报告-三种方法解决旋转矩阵问题

Spiral Matrix IIGiven an integer n, generate a square matrix filled with elements from 1 to n2 in spiral order. For example,Given n = 3, You should return the following matrix:[ [ 1, 2, 3 ], [ 8, 9, 4 ], [ 7, 6, 5 ]] SOLUTION 1: 还是与上一题Spiral Matrix类似

访问Mat矩阵中的元素并为其赋值

在OpenCV中有三种方式访问矩阵中的数据元素:容易的方式,困难的方式,以及正确的方式.今天主要讲容易方式: 最容易的方式是使用宏CV_MAT_ELEM( matrix, elemtype, row, col ),输入参数是矩阵,不是指针,网上有很多人说是指针,矩阵元素类型,行,列,返回值是相应行,列的矩阵元素.CV_MAT_ELEM可以给矩阵赋值,也可以访问矩阵元素. CV_MAT_ELEM宏实际上会调用CV_MAT_ELEM_PTR(matrix,row,col)宏来完成任务. CV_MAT

一个N*M的矩阵,找出这个矩阵中所有元素的和不小于K的面积最小的子矩阵

题目描述: 一个N*M的矩阵,找出这个矩阵中所有元素的和不小于K的面积最小的子矩阵(矩阵中元素个数为矩阵面积) 输入: 每个案例第一行三个正整数N,M<=100,表示矩阵大小,和一个整数K 接下来N行,每行M个数,表示矩阵每个元素的值 输出: 输出最小面积的值.如果出现任意矩阵的和都小于K,直接输出-1. 样例输入: 4 4 10 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 样例输出: 1 首先这个题应该是有一个动态规划的解法,不过好像复杂度也要到O(n^3lo