对角线遍历

对角线遍历

image-20200426154805231

自己写的,没水平 52/56

   /**
     * 对角线遍历
     *
     * 结果: 超出内存  通过  52/56
     * @param nums
     * @return
     */
    public int[] findDiagonalOrder(List<List<Integer>> nums) {
        int r = nums.size();
        int c = 0;
        //集合元素的数量
        int count = 0;
        Integer[][] res = new Integer[r][];
        for (int i = 0; i < r; i++) {
            Integer[] t2 = new Integer[nums.get(i).size()];
            nums.get(i).toArray(t2);
            res[i] = t2;
            int temp = res[i].length;
            count += temp;
            if (temp > c) {
                c = temp;
            }
        }
        //设置行遍历终点
        int max = Math.max(r, c);
        Integer[][] res2=new Integer[max][max];
        for(int i=0;i<res.length;i++){
            for(int j=0;j<res[i].length;j++){
               res2[i][j]=res[i][j];
            }
        }
        res=null;
        int[] a = new int[count];
        //数组a标记
        int index = 0;

        for (int i = 0; i <= max - 1; i++) {
            int temp = i;
            for (int n = 0; n <= i&&temp>=0; n++) {
                if (res2[temp][n] != null) {
                    a[index++] = res2[temp][n];
                }
                temp--;
            }
        }
        for(int j=1;j<=max-1;j++){
            int temp=j;
            for(int i=max-1;i>=j;i--){
                if (res2[i][temp] != null) {
                    if(index>=count){
                        return a;
                    }
                    a[index++] = res2[i][temp];
                }
                temp++;
            }
        }
        return a;
    }

解题思路:

根据矩形的特点,设行的标号为i,列的标号为j。则对于每一条对角线而言,i + j的值是唯一的。
知道这一点之后,就可以按照对角线对nums中的值进行聚类。聚类完毕后,将所有的数值生成一个数组即可。
需补充Map类型的区别
public int[] findDiagonalOrder2(List<List<Integer>> nums){
        int len=0;
        Map<Integer,List<Integer>> map=new TreeMap<>();  //默认对可以进行排序   可指定排序依据
        for(int i=0;i<nums.size();i++){
            len+=nums.get(i).size();
            for(int j=0;j<nums.get(i).size();j++){
                if(map.containsKey(i+j)){
                    map.get(i+j).add(nums.get(i).get(j));
                }else{
                    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(int key:map.keySet()){
            List<Integer> list=map.get(key);
            for(int j=list.size()-1;j>=0;j--){
                ans[index]=list.get(j);
                index++;
            }
        }
        return ans;
    }

image-20200426155530174

知识点补充:

几种常见的Map区别

原文地址:https://www.cnblogs.com/yh-simon/p/12780301.html