• 对角线遍历


    对角线遍历

    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区别

  • 相关阅读:
    Vue(小案例_vue+axios仿手机app)_go实现退回上一个路由
    nyoj 635 Oh, my goddess
    nyoj 587 blockhouses
    nyoj 483 Nightmare
    nyoj 592 spiral grid
    nyoj 927 The partial sum problem
    nyoj 523 亡命逃窜
    nyoj 929 密码宝盒
    nyoj 999 师傅又被妖怪抓走了
    nyoj 293 Sticks
  • 原文地址:https://www.cnblogs.com/yh-simon/p/12780301.html
Copyright © 2020-2023  润新知