zoukankan      html  css  js  c++  java
  • 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;
        }
  • 相关阅读:
    链表--判断一个链表是否为回文结构
    矩阵--“之”字形打印矩阵
    二叉树——平衡二叉树,二叉搜索树,完全二叉树
    链表--反转单向和双向链表
    codeforces 490C. Hacking Cypher 解题报告
    codeforces 490B.Queue 解题报告
    BestCoder19 1001.Alexandra and Prime Numbers(hdu 5108) 解题报告
    codeforces 488A. Giga Tower 解题报告
    codeforces 489C.Given Length and Sum of Digits... 解题报告
    codeforces 489B. BerSU Ball 解题报告
  • 原文地址:https://www.cnblogs.com/houzheng/p/11681711.html
Copyright © 2011-2022 走看看