[LeetCode] 1424. Diagonal Traverse II

Given a 2D integer array nums, return all elements of nums in diagonal order as shown in the below images.

Example 1:
Image
Input: nums = [[1,2,3],[4,5,6],[7,8,9]]
Output: [1,4,2,7,5,3,8,6,9]

Example 2:
Image
Input: nums = [[1,2,3,4,5],[6,7],[8],[9,10,11],[12,13,14,15,16]]
Output: [1,6,2,8,7,3,9,4,12,10,5,13,11,14,15,16]

Constraints:
1 <= nums.length <= 105
1 <= nums[i].length <= 105
1 <= sum(nums[i].length) <= 105
1 <= nums[i][j] <= 105

对角线遍历 II。

给你一个列表 nums ,里面每一个元素都是一个整数列表。请你依照下面各图的规则,按顺序返回 nums 中对角线上的整数。

思路

这道题跟版本一类似,还是让我们以对角线分组输出矩阵中的值。我们可以把 i + j 当做 key 放入一个 hashmap,因为在同一条对角线上的元素的 i + j 的值是相同的,所以我们可以这样分组。注意因为我们对整个二维 list 是逐行扫描的所以当我们加入元素的时候,元素需要被加入他所在 hashmap 那条对角线的第一个,这样顺序才不会乱。

复杂度

时间O(mn)
空间O(mn) - output有这么多元素

代码

Java实现

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
class Solution {
public int[] findDiagonalOrder(List<List<Integer>> nums) {
HashMap<Integer, List<Integer>> map = new HashMap<>();
int count = 0;
for (int i = 0; i < nums.size(); i++) {
for (int j = 0; j < nums.get(i).size(); j++) {
map.putIfAbsent(i + j, new ArrayList<>());
map.get(i + j).add(0, nums.get(i).get(j));
count++;
}
}

int[] res = new int[count];
int index = 0;
for (int key = 0; key <= map.size(); key++) {
if (map.containsKey(key)) {
for (int val : map.get(key)) {
res[index++] = val;
}
}
}
return res;
}
}

[LeetCode] 1424. Diagonal Traverse II
https://shurui91.github.io/posts/3710440472.html
Author
Aaron Liu
Posted on
November 24, 2023
Licensed under