LeetCode 1424. 对角线遍历 II
题目描述
思路分析
解法一:按对角线分组(推荐)
核心思路:
- 元素
(i, j)位于第i + j条对角线。- 将同一对角线元素收集到桶中。
- 输出时对每个桶逆序遍历,满足从下到上的顺序。
复杂度分析:
- 时间复杂度:O(m),其中 m 表示所有元素总数。
- 空间复杂度:O(m),用于分组存储。
import java.util.ArrayList;
import java.util.List;
class Solution {
public int[] findDiagonalOrder(List<List<Integer>> nums) {
List<List<Integer>> bucket = new ArrayList<>();
int total = 0;
for (int i = 0; i < nums.size(); i++) {
List<Integer> row = nums.get(i);
total += row.size();
for (int j = 0; j < row.size(); j++) {
int key = i + j;
while (bucket.size() <= key) {
bucket.add(new ArrayList<>());
}
bucket.get(key).add(row.get(j));
}
}
int[] res = new int[total];
int idx = 0;
for (List<Integer> diag : bucket) {
for (int i = diag.size() - 1; i >= 0; i--) {
res[idx++] = diag.get(i);
}
}
return res;
}
}
func findDiagonalOrder(nums [][]int) []int {
bucket := make([][]int, 0)
total := 0
for i := 0; i < len(nums); i++ {
row := nums[i]
total += len(row)
for j := 0; j < len(row); j++ {
key := i + j
for len(bucket) <= key {
bucket = append(bucket, []int{})
}
bucket[key] = append(bucket[key], row[j])
}
}
res := make([]int, 0, total)
for _, diag := range bucket {
for i := len(diag) - 1; i >= 0; i-- {
res = append(res, diag[i])
}
}
return res
}
相似题目
| 题目 | 难度 | 考察点 |
|---|---|---|
| 498. 对角线遍历 | 中等 | 模拟、分组 |
| 1329. 将矩阵按对角线排序 | 中等 | 对角线分组 |
| 54. 螺旋矩阵 | 中等 | 模拟 |
| 59. 螺旋矩阵 II | 中等 | 模拟 |
| 566. 重塑矩阵 | 简单 | 矩阵遍历 |
| 867. 转置矩阵 | 简单 | 矩阵遍历 |
本博客所有文章除特别声明外,均采用
CC BY-NC-SA 4.0
许可协议,转载请注明出处!

