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;
    }

 

上一篇:小白的C++之路——求质数


下一篇:消息队列(五)--- RocketMQ-消息存储4