欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

LeetCode算法 -- 螺旋矩阵(第三题)

程序员文章站 2022-06-07 12:45:12
...

一、题目说明

LeetCode算法 -- 螺旋矩阵(第三题)

二、求解思路

螺旋矩阵,它是要顺时针遍历,先遍历外层,再遍历内层。

现在有一个矩阵为:
1 2 3
4 5 6
7 8 9

首先我们输出第一行,然后向下改变方向,继续输出,当我们输出完第一行后的矩阵为:
4 5 6
7 8 9

我们下一次要输出的是 6 9,这时我们可以将矩阵反转:
6 9
5 8
4 7

输出第一行,结果为:
5 8
4 7

然后继续反转:
8 7
5 4

输出第一行后,结果为:
5 4

继续反转:
4
5

输出第一行后,继续输出,就将所有的数字以顺时针螺旋方式输出。

三、代码实现

package question3;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

/**
 * @description: 给定一个包含 m * n 个元素的矩阵,按照顺时针顺序,返回矩阵中的所有元素
 * @author: hyr
 * @time: 2020/3/17 8:44
 */
public class Solution {
    public static void main(String[] args) {
        int[][] matrix = new int[][]{{1, 2, 3}, {4, 5, 6}, {7, 8, 9}};
        System.out.println("矩阵为:");
        System.out.println(Arrays.deepToString(matrix));

        System.out.println();

        System.out.println("按照顺时针顺序遍历的结果为:");
        System.out.println(spiralOrder(matrix));
    }

    public static List<Integer> spiralOrder(int[][] matrix) {
        List<Integer> result = new ArrayList<>();
        // 判断数组是否为空
        if (matrix.length == 0) {
            return result;
        }
        // 求出数组的行数
        int row = matrix.length;
        int line = matrix[0].length;

        while (true) {
            // 首先将第一行放入结果集
            for (int i : matrix[0]) {
                result.add(i);
            }
            // 去除第一行
            matrix = Arrays.copyOfRange(matrix, 1, row);

            // 跳出循环条件(数组的长度为空)
            if (matrix.length == 0) {
                break;
            }
            // 求出新长度
            row = matrix.length;
            line = matrix[0].length;

            // 进行数组旋转(转置)
            int[][] ans = new int[line][row];
            for (int i = line - 1; i >= 0; i--) {
                for (int j = 0; j < row; j++) {
                    ans[line - 1 - i][j] = matrix[j][i];
                }
            }

            matrix = ans;

            // 更新行数,为下一次循环的跳出条件做判断
            row = matrix.length;
        }
        return result;
    }
}

结果为:

矩阵为:
[[1, 2, 3], [4, 5, 6], [7, 8, 9]]

按照顺时针顺序遍历的结果为:
[1, 2, 3, 6, 9, 8, 7, 4, 5]
相关标签: 数据结构与算法