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; }
总结
这个题目特别的考验指针在二维数组中的走位,如果全凭数组中的边界去控制指针的走位,这个比较的困难。可以设置一些边界值来控制指针这样会使得算法更加的简单。
阅读全文
0 0
- LeetCode 54. Spiral Matrix
- [LeetCode]54.Spiral Matrix
- LeetCode --- 54. Spiral Matrix
- [Leetcode] 54. Spiral Matrix
- [leetcode] 54.Spiral Matrix
- Leetcode-54.Spiral Matrix
- **LeetCode 54. Spiral Matrix
- Leetcode 54. Spiral Matrix
- [leetcode] 54. Spiral Matrix
- leetcode 54. Spiral Matrix
- 54. Spiral Matrix LeetCode
- leetcode 54. Spiral Matrix
- LeetCode *** 54. Spiral Matrix
- [LeetCode]54. Spiral Matrix
- LeetCode 54. Spiral Matrix
- LeetCode--54. Spiral Matrix
- LeetCode - 54. Spiral Matrix
- [Leetcode]54. Spiral Matrix
- Xception
- 在Linux上安装Git
- JVM内存结构分析
- js取前一天的时间
- java多线程之多个线程访问共享对象和数据的方式
- LeetCode 54. Spiral Matrix
- 2018考研在即!报考备考全攻略思维导图!
- d3 力导向图
- oracle转mysql总结
- Kaldi脚本分析(1)——数据准备
- 使用Ajax+JQuery构造分页查询列表
- 剑指Offer:面试题32:从1到n整数中1出现的次数
- HDU 3367 Pseudoforest(kruskal最大生成树变形)
- PAT1008. 数组元素循环右移问题 (20)