给你一个列表 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]
假设 nums 是 m*n 的,按照题目的要求:
我们可以维护一个 LinkedHashMap(注意是 LinkedHashMap,因为需要插入的顺序),依次遍历 List<List<Integer>> nums 中的每个元素,将元素索引 i+j 作为 key 放入 map,value 是所有的元素(一个 list)。
最终的结果其实也就是将 map 顺序遍历出来,组合一下。不过每个 list 要 reverse 一下。
class Solution {
public int[] findDiagonalOrder(List<List<Integer>> nums) {
Map<Integer, List<Integer>> map = new LinkedHashMap<>();
for (int i = 0; i < nums.size(); i++) {
List<Integer> list = nums.get(i);
for (int j = 0; j < list.size(); j++) {
List<Integer> res = map.getOrDefault(i + j, new ArrayList<>());
res.add(list.get(j));
map.put(i + j, res);
}
}
List<Integer> ans = map.values().stream().peek(Collections::reverse).flatMap(List::stream).collect(Collectors.toList());
int[] result = new int[ans.size()];
for (int i = 0; i < ans.size(); i++) {
result[i] = ans.get(i);
}
return result;
}
}
项目 GitHub LeetCode 全解,欢迎大家 star、fork、merge,共同打造最全 LeetCode 题解!
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。