Leetcode 1424. 对角线遍历 II

Leetcode 1424. 对角线遍历 II_第1张图片
思路:矩阵对角线的规律 :
主对角线中 row + col 是唯一的
副对角线中 col - row 是唯一的

注意逆序输出
注意点:LinkedHashMap和hashMap和TreeMap的区别,HashMap是无序的,当我们希望有顺序地去存储key-value时,就需要使用LinkedHashMap了,TreeMap中默认的排序为升序,如果要改变其排序可以自己写一个Comparator
使用LinkedHashMap或者TreeMap都可以,但如果使用HashMap,最后一个测试用例不能通过。

class Solution {
     
    public static int[] findDiagonalOrder(List<List<Integer>> nums) {
     
        // 数字总个数
        int len = 0;
        Map<Integer, List<Integer>> map = new LinkedHashMap<>();
        // 遍历矩阵
        for (int i = 0; i < nums.size(); i++) {
     
            // 每一行有多少个数字
            len += nums.get(i).size();
            for (int j = 0; j < nums.get(i).size(); j++) {
     
                // 哈希表中是否存在 (i+j) 键
                if (map.containsKey(i+j)){
     
                    // 如果存在,直接哈希表的值(list)中追加一个元素。
                    map.get(i+j).add(nums.get(i).get(j));
                }else {
     
                    // 新建一个list存放对角线的第一个元素(右上方)
                    List<Integer> list = new ArrayList<>();
                    list.add(nums.get(i).get(j));
                    map.put(i+j, list);
                }
            }
        }
        int[] ans = new int[len];
        int index = 0;
        // 遍历哈希表
        for (Integer key : map.keySet()) {
     
            // 哈希表的 值  也就是List
            List<Integer> list = map.get(key);
            // List逆序存放
            for (int i = list.size() - 1; i >= 0; i--) {
     
                ans[index++] = list.get(i);
            }
        }
        return ans;
    }

    public static void main(String[] args) {
     
        ArrayList<List<Integer>> nums = new ArrayList<>();
        nums.add(List.of(1,2,3));
        nums.add(List.of(4,5,6));
        nums.add(List.of(7,8,9));
        int[] diagonalOrder = findDiagonalOrder(nums);
        System.out.println(diagonalOrder);
    }
}

你可能感兴趣的:(Leetcode,Hash)