LeetCode算法 -- 螺旋矩阵(第三题)
程序员文章站
2022-06-07 12:45:12
...
一、题目说明
二、求解思路
螺旋矩阵,它是要顺时针遍历,先遍历外层,再遍历内层。
现在有一个矩阵为:
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]
上一篇: Tire(字典树)
下一篇: PTA-C入门与进阶练习 87
推荐阅读
-
【leetcode 简单】第三题 回文数
-
python(leetcode)-重复元素算法题
-
【每日一道算法题】Leetcode之longest-increasing-path-in-a-matrix矩阵中的最长递增路径问题 Java dfs+记忆化
-
Python实现螺旋矩阵的填充算法示例
-
【重拾算法~Leetcode每日一题】309.最佳买卖股票时机含冷冻期(难度:中等)
-
LeetCode刷题|算法归类|贪心算法介绍及各算法题合辑(持续补充)
-
LeetCode算法题(数组相关)(二)——两数之和
-
leetcode 算法题1046 (简单277) 最后一块石头的重量
-
LeetCode 矩阵置零(73题)
-
一道简单的算法题:不借助第三变量来交换两个变量的值