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]

解题思路

在这里插入图片描述

在这里插入图片描述
从上边,到右边,到下边,到左边,依次遍历
从第一个外层按顺时针顺序排列的所有元素,然后是第二个外层的元素,依此类推。

我们首先定义四个元素,r1,r2,c1,c2,这将框定一个范围,我们顺时针打印这个范围边上的值,每次打印以后再次缩小框。

好的问题来了?

1.要打印几个框?

times=Math.min(长,宽)%2==0?Math.min(长,宽)/2:Math.min(长,宽)/2+1;

2.顺时针打印的横纵坐标变化规律?如图所示有颜色是要打印的框

实现

class Solution {
    public List<Integer> spiralOrder(int[][] matrix) {
        if (matrix.length == 0 || matrix == null) {
            return new ArrayList<Integer>();
        }
        List<Integer> reslist = new ArrayList<>();
        int m = matrix.length;//hang
        int n = matrix[0].length;//lie
        if (m == 1) {
            for (int i = 0; i < n; i++) {
                reslist.add(matrix[0][i]);
            }
            return reslist;
        }
        if (n == 1) {
            for (int i = 0; i < m; i++) {
                reslist.add(matrix[i][0]);
            }
            return reslist;
        }
        int c1 = 0;
        int c2 = n - 1;
        int r1 = 0;
        int r2 = m - 1;
        int times = Math.min(m, n) % 2 == 0 ? Math.min(m, n) / 2 : Math.min(m, n) / 2 + 1;
        for (int i = 0; i < times; i++) {
            for (int c = c1; c <= c2; c++) {
                reslist.add(matrix[r1][c]);
            }
            for (int j = r1 + 1; j <=r2; j++) {
                reslist.add(matrix[j][c2]);
            }
            if (c1 < c2 && r1 < r2) {
                for (int a = c2 - 1; a > c1; a--) {
                    reslist.add(matrix[r2][a]);
                }
                for (int b = r2; b > r1; b--) {
                    reslist.add(matrix[b][c1]);
                }
            }
            c1++;
            c2--;
            r1++;
            r2--;
        }
        return reslist;

    }
}

猜你喜欢

转载自blog.csdn.net/Growing_way/article/details/83276682