1424. 对角线遍历 II

72 阅读1分钟

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

算法:
方法一:模拟
TLE,遍历了大量对角线上为空的位置

func findDiagonalOrder(nums [][]int) []int {
    n, m := len(nums), len(nums[0])
    count := 0
    for i := range nums {
        count = count + len(nums[i])
        if len(nums[i]) > m {
            m = len(nums[i])
        }
    }
    i, j := 0, 0
    ans := make([]int, 0) 
    prei, prej := 0, 0
    for count > 0 {
        if 0 <= i && i < n && 0 <= j && j < len(nums[i]) {
            ans = append(ans, nums[i][j])
            count --
        }
        x, y := i - 1, j + 1
        // 出界到了矩阵的上方或者右方,需要调整起始坐标
        if x < 0 || y >= m {
            // 横坐标方向没遍历完,先遍历横坐标方向
            if prei < n - 1 {
                prei ++
                x = prei
                y = 0
            } else {
                prej ++
                x = n - 1
                y = prej
            }
            
            
        }
        i, j = x, y
    }
    return ans
}

方法二:模拟
利用对角线上坐标之和相等的特性,构造[sum][stack]int二元数组,遍历整个矩阵,将坐标和sum相同的值放到同一个stack中,最后根据sum从小到大遍历,对每一个stack出栈,即可得到结果。

func findDiagonalOrder(nums [][]int) []int {
    n, m := len(nums), len(nums[0])
    ans := make([]int, 0)
    for i := range nums {
        if len(nums[i]) > m {
            m = len(nums[i])
        }
    }
    tmp := make([][]int, n + m - 1)
    for i := range nums {
        for j := range nums[i] {
            sum := i + j
            if tmp[sum] == nil {
                tmp[sum] = make([]int, 0)
            }
            tmp[sum] = append(tmp[sum], nums[i][j])
        }
    }

    for i := range tmp {
        for j := len(tmp[i]) - 1; j >= 0; j --  {
            ans = append(ans, tmp[i][j])
        }
    }
    return ans
}