zoukankan      html  css  js  c++  java
  • 算法(1):给定一个整数数组 nums ,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和,并顺序打印子序列。

    题目

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

    代码

    public class MaximumSubSequenceSum {
    
        public static void main(String[] args) {
            Scanner s = new Scanner(System.in);
            String array = s.nextLine();
            if(array.length()<=2){return;}
            int[] data = Arrays.stream(array.split(",")).mapToInt(Integer::parseInt).toArray();
            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;
        }
    }
    
    
  • 相关阅读:
    软件工程课程-助教自我介绍
    软件工程课程-课代表信息
    软件工程课程-课后作业
    小知识记录:第四篇
    小知识记录:第三篇
    小知识记录:第二篇
    小知识记录:第一篇
    dd命令和fio命令测试磁盘io性能
    horizon仪表盘安装
    OpenStack安装部署笔记
  • 原文地址:https://www.cnblogs.com/houzheng/p/13069689.html
Copyright © 2011-2022 走看看