LeetCode 1424. 对角线遍历 II

题目描述

1424. 对角线遍历 II

image-20230311221635654

image-20230311221632404

思路分析

解法一:按对角线分组(推荐)

核心思路

  • 元素 (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. 转置矩阵 简单 矩阵遍历
本文作者:
本文链接: https://hgnulb.github.io/blog/2023/82818286
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处!