zoukankan      html  css  js  c++  java
  • 对角线遍历

    对角线遍历

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

  • 相关阅读:
    redis单机安装以及简单redis集群搭建
    Linux中JDK安装教程
    微信公众号开发(一)
    easyui多图片上传+预览切换+支持IE8
    mybatis动态sql之foreach标签
    java List递归排序,传统方式和java8 Stream优化递归,无序的列表按照父级关系进行排序(两种排序类型)
    java钉钉通讯录同步
    java使用poi生成导出Excel(新)
    java 图片转base64字符串、base64字符串转图片
    Spring事务mysql不回滚:mysql引擎修改
  • 原文地址:https://www.cnblogs.com/yh-simon/p/12780301.html
Copyright © 2011-2022 走看看