题目:
给你一个列表 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
}