[LeetCode] 1424. Diagonal Traverse II

发布时间 2023-11-25 03:01:06作者: CNoodle

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实现

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;
    }
}