注意数据范围
排序
class Solution {
// 排序,按照 i + j 从小到大排序
// i + j 相同时,按照 i 从大到小排序
public int[] findDiagonalOrder(List<List<Integer>> nums) {
List<int[]> list = new ArrayList<>();
for (int i = 0; i < nums.size(); i++) {
for (int j = 0; j < nums.get(i).size(); j++) {
list.add(new int[]{nums.get(i).get(j), i, j});
}
}
Collections.sort(list, (x, y) -> {
if (x[1] + x[2] == y[1] + y[2]) return y[1] - x[1];
return (x[1] + x[2]) - (y[1] + y[2]);
});
int[] res = new int[list.size()];
for (int i = 0; i < res.length; i++) {
res[i] = list.get(i)[0];
}
return res;
}
}
直接模拟
class Solution {
public int[] findDiagonalOrder(List<List<Integer>> nums) {
int len = 0;
for (int i = 0; i < nums.size(); i++) {
for (int j = 0; j < nums.get(i).size(); j++) {
len = Math.max(len, i + j);
}
}
List<List<Integer>> list = new ArrayList<>();
// 一共有 len + 1 条对角线
for (int i = 0; i < len + 1; i++) {
list.add(new ArrayList<>());
}
int cnt = 0;
for (int i = 0; i < nums.size(); i++) {
for (int j = 0; j < nums.get(i).size(); j++) {
cnt++;
list.get(i + j).add(nums.get(i).get(j));
}
}
int[] res = new int[cnt];
for (int i = 0, idx = 0; i < list.size(); i++) {
// System.out.println(list.get(i).toString());
for (int j = list.get(i).size() - 1; j >= 0; j--) {
res[idx++] = list.get(i).get(j);
}
}
return res;
}
}