力扣题目
解题思路
java代码
力扣题目:
给你一个大小为 m x n
的矩阵 mat
,请以对角线遍历的顺序,用一个数组返回这个矩阵中的所有元素。
示例 1:
输入:mat = [[1,2,3],[4,5,6],[7,8,9]] 输出:[1,2,4,7,5,3,6,8,9]
示例 2:
输入:mat = [[1,2],[3,4]] 输出:[1,2,3,4]
解题思路:
算法原理:
通过遍历矩阵的对角线来获取对角线上的元素。由于对角线的方向在奇数和偶数索引时不同,所以分别处理这两种情况。
思路:
- 首先判断矩阵是否为空,如果为空则返回空数组。
- 计算矩阵的行数
row
和列数col
,并创建结果数组res
。 - 外层循环遍历所有可能的对角线索引
i
。 - 当
i
为偶数时,从左上方到右下方遍历对角线,通过控制循环变量j
,确保访问的位置在矩阵范围内,并将元素添加到结果数组中。 - 当
i
为奇数时,从右上方到左下方遍历对角线,同样通过控制j
来确保访问合法位置,并添加元素到结果数组。
代码分析:
- 在
findDiagonalOrder
方法中,首先进行边界情况处理。 - 然后通过两层循环来遍历对角线。
- 偶数对角线时,从左上方开始,逐渐向右下方移动。
- 奇数对角线时,从右上方开始,逐渐向左下方移动。
- 在每次循环中,根据条件判断访问位置是否合法,并将对应元素添加到结果数组。
时间复杂度:O(m×n),其中 m
是矩阵的行数,n
是矩阵的列数。需要遍历矩阵中的每个元素。
空间复杂度:O(m×n),用于存储结果数组。
java代码:
package org.example;
public class Leetcode498 {
public static void main(String[] args) {
int [] res = new Leetcode498().findDiagonalOrder(new int[][]{{1,2,3},{4,5,6},{7,8,9}});
for (int i = 0; i < res.length; i++){
System.out.print(res[i] + " ");
}
}
public int[] findDiagonalOrder(int[][] matrix) {
if (matrix.length == 0) return new int[]{};
int row = matrix.length;
int col = matrix[0].length;
int[] res = new int[row * col];
int index = 0;
for (int i = 0; i < row + col - 1; i++) {
if (i % 2 == 0) {
for (int j = 0; j <= i; j++) {
if (j < col && i - j < row) {
res[index++] = matrix[i - j][j];
}
}
} else {
for (int j = i; j >= 0; j--) {
if (j < col && i - j < row) {
res[index++] = matrix[i - j][j];
}
}
}
}
return res;
}
}
更多详细内容同步到公众号,感谢大家的支持!
每天都会给刷算法的小伙伴推送明日一题,并且没有任何收费项