LeetCode 54. Spiral Matrix

来源:互联网 发布:青岛软件开发薪资 编辑:程序博客网 时间:2024/06/02 02:57

问题描述

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].

问题分析

给定一个m*n的数组,求逆时针显示出当前二维数组中的值。有两种做法。分别显示上面一行,右边一列。然后是下边一行,左边一列。这个当中需要注意的是下边一行和左边一列在只有一行的时候不需要输出,这个需要进行一下判断。
第一种做法是使用i和j进行走位来输出这个当中的值。

public List<Integer> spiralOrder(int[][] matrix) {        if (matrix == null || matrix.length == 0 || matrix[0].length == 0) {            return Collections.EMPTY_LIST;        }        int m = matrix.length;        int n = matrix[0].length;        int max = Math.min(m, n);        int count = max % 2 == 0 ? max / 2 : max / 2 + 1;        List<Integer> result = new ArrayList<Integer>(m * n);        for (int index = 0; index < count; index++) {//开始走位            int i = index;//行号            int j = index;//列好            for (; (j < n - index); j++) {                result.add(matrix[i][j]);//上面一行            }            for (i++, j--; (i < m - index); i++) {//右边的一列                result.add(matrix[i][j]);            }            for (i--, j--; j >= index && i > index; j--) {//下面一行                result.add(matrix[i][j]);            }            for (j++, i--; i > index && j < n - index-1; i--) {               result.add(matrix[i][j]);            }        }        return result;    }

这个题目中,通过i和j的变量去判断当前系统的边界,这个过程比较的难以控制,不够直观。可以使用四个变量来分别指定i和j的行走的轨迹,这样更加容易理解和控制。

代码实现

public List<Integer> spiralOrder(int[][] matrix) {        if (matrix == null || matrix.length == 0 || matrix[0].length == 0) {            return Collections.EMPTY_LIST;        }        List<Integer> result = new ArrayList<Integer>();        int rowStart = 0;        int rowEnd = matrix.length - 1;        int colStart = 0;        int colEnd = matrix[0].length - 1;        while (rowStart <= rowEnd && colStart <= colEnd) {            for (int i = colStart; i <= colEnd; i++) {                result.add(matrix[rowStart][i]);            }            rowStart++;            for (int j = rowStart; j <= rowEnd; j++) {                result.add(matrix[j][colEnd]);            }            colEnd--;            if (rowEnd >= rowStart) {                for (int i = colEnd; i >= colStart; i--) {                    result.add(matrix[rowEnd][i]);                }                rowEnd--;            }            if (colStart <= colEnd) {                for (int j = rowEnd; j >= rowStart; j--) {                    result.add(matrix[j][colStart]);                }                colStart++;            }        }        return result;    }

总结

这个题目特别的考验指针在二维数组中的走位,如果全凭数组中的边界去控制指针的走位,这个比较的困难。可以设置一些边界值来控制指针这样会使得算法更加的简单。