avatar

LeetCode-1424 对角线遍历II⭐

📝题目

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
给你一个列表 nums ,里面每一个元素都是一个整数列表。请你依照下面各图的规则,按顺序返回 nums 中对角线上的整数。 

示例 1:

输入:nums = [[1,2,3],[4,5,6],[7,8,9]]
输出:[1,4,2,7,5,3,8,6,9]

示例 2:

输入:nums = [[1,2,3,4,5],[6,7],[8],[9,10,11],[12,13,14,15,16]]
输出:[1,6,2,8,7,3,9,4,12,10,5,13,11,14,15,16]

示例 3:

输入:nums = [[1,2,3],[4],[5,6,7],[8],[9,10,11]]
输出:[1,4,2,5,3,8,6,9,7,10,11]

示例 4:

输入:nums = [[1,2,3,4,5,6]]
输出:[1,2,3,4,5,6] 

提示:

· 1 <= nums.length <= 10^5
· 1 <= nums[i].length <= 10^5
· 1 <= nums[i][j] <= 10^9
nums 中最多有 10^5 个数字。

示例1

示例2

📝思路

因为矩阵不是完整填充的,所以不能直接遍历。考虑到是顺着对角线的同一方向,那么x+y就是相等的且次序一致,那么可以按照x+y去分类,建立一个二维数组ans[i] [j],i表示(x+y),然后正常遍历这个nums,每遍历到一个元素,看看它的x+y,把它丢到ans[x+y]中。
对角线遍历的另一种设定👉LeetCode-498 对角线遍历

📝题解

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
vector<int> findDiagonalOrder(vector<vector<int>>& nums) {
vector<int> result;
int row = nums.size();
vector<vector<int>> arr;//[i+j][count]
arr.resize(1e5);
int max = 0;
for (int i = 0; i < row; ++i){
int column = nums[i].size();
for (int j = 0; j < column; ++j){
arr[i+j].push_back(nums[i][j]);
}
max = column > max ? column : max;
}
for (int i = 0; i < row+max; ++i){
while (!arr[i].empty()){
result.push_back(arr[i].back());
arr[i].pop_back();
}
}
return result;
}
Author:WhiteBeerHouse
Link:https://github.com/WhiteBeerHouse/WhiteBeerHouse.github.io/tree/master/2020/04/28/LeetCode-1424-%E5%AF%B9%E8%A7%92%E7%BA%BF%E9%81%8D%E5%8E%86II%E2%AD%90/
Copyright Notice:All articles in this blog are licensed under CC BY-NC-SA 4.0 unless stating additionally.