• java基础算法(一):最大子序列和问题的多种算法思路


    问题:

    /**
    * 给定一个整数数组 nums ,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和,并顺序打印子序列。
    * 示例:
    * 输入: [-2,1,-3,4,-1,2,1,-5,4],
    * 输出: 6,并打印连续子序列
    * 解释: 连续子数组 [4,-1,2,1] 的和最大,为 6。
    */

    测试main方法:

        public static void main(String[] args) {
            int[] data={1,-2,3,4,-8,12,2};
            System.out.println(subSequenceSum01(data));
            System.out.println(subSequenceSum02(data));
        }

    算法一

        //算法一: 穷举遍历,比较找出最大的
        private static Integer subSequenceSum01(int[] array){
            int maxNum=0;
            Map<Integer, List<Integer>> subSequence=new HashMap<>();
            for (int i = 0; i < array.length; i++) {
                for (int j = i; j < array.length; j++) {
                    int thisNum=0;
                    List<Integer> list=new LinkedList<>();//保存子序列
                    // i: 子序列开始下标 j:结束下标
                    for (int k = i; k <= j; k++){
                        thisNum+=array[k]; //每一次计算里循环子序列和
                        list.add(array[k]);
                    }
                    if(thisNum>maxNum){
                        maxNum=thisNum;
                        subSequence.put(maxNum,list);//每一次最大值和对应子序列
                    }
                }
            }
            // Arrays.toString 数组转换字符串
            System.out.println("算法一:"+Arrays.toString(subSequence.get(maxNum).toArray()));
            return maxNum;
        }

    算法二

        //算法二, 改进算法一,不需要计算每一次子序列和,采用累加方式,一步步找出最大值
        private static Integer subSequenceSum02(int[] array){
            int maxNum=0;
            Map<Integer, List<Integer>> subSequence=new HashMap<>();
            for (int i = 0; i < array.length; i++) {
                int thisNum=0;
                List<Integer> list=new LinkedList<>();//保存子序列
                for (int j = i; j < array.length; j++) {
                    thisNum+=array[j];   //子序列值累加,从开始累加到结尾计算出最大值
                    list.add(array[j]);
                    if(thisNum>maxNum){
                        maxNum=thisNum;
                        List<Integer> subList = new ArrayList<>();//每次都需要一个新集合,否则值会变
                        subList.addAll(list);
                        subSequence.put(maxNum,subList);//每一次最大值和对应子序列
                    }
                }
            }
            System.out.println("算法二:"+Arrays.toString(subSequence.get(maxNum).toArray()));
            return maxNum;
        }
  • 相关阅读:
    043_MySQL 索引原理 与 慢查询优化
    042_MySQL 之【视图】【触发器】【存储过程】【函数】【事物】【数据库锁】【数据库备份】
    041_SQL逻辑查询语句执行顺序
    039_MySQL 数据操作
    040_数据库设计三范式
    039_MySQL_多表查询
    039_MySQL_单表查询
    038_MySQL 表的操作
    MySQL 存储引擎
    037_MySQL操作
  • 原文地址:https://www.cnblogs.com/houzheng/p/11681711.html
Copyright © 2020-2023  润新知