zoukankan      html  css  js  c++  java
  • 01-最大子列和问题(java)

    问题描述:给定N个整数的序列{A1,A2,A3,…,An},求解子列和中最大的值。

    这里我们给出{-2,11,-4,13,-5,-2}这样一个序列,正确的最大子列和为20

    该题是在数据结构与算法中经常用于分析时间复杂度的典型题目,以下将给出四种方法来求解

    方法一:穷举法

     思路:将每一个子列的和都算出来,然后找出最大子列和。

    时间复杂度为O(n3)

        public int maxSubSum1(int[] arr) {
            int maxSum = 0;
            //获取数组大小,即循环大小
            int length = arr.length;
            //第一重循序,0 ~ length
            for (int i = 0; i < length; i++) {
                //第二重循序,i ~ length
                for (int j = i; j < length; j++) {
                    //每次求和前,将thisSum重置为0
                    int thisSum = 0;
                    //第三重循序,开始计算子列和
                    for (int k = i; k < j; k++) {
                        thisSum += arr[k];
                        //更新最大值
                        if (thisSum > maxSum) {
                            maxSum = thisSum;
                        }
                    }
                }
            }
            return maxSum;
        }

     

    方法二:穷举法优化

    思路:在方法一中,我们需要把每一个子列中的每一项分别相加求和。

    我们可以对计算过程进行优化:前一次遍历已经计算出N1,N2,..Ni的和sum,那么下一个子列N1,N2,..Ni,Ni+1的和即为sum+Ni+1,不需要再把每一项遍历求和了。

    时间复杂度为O(n2)

        public int maxSubSum1(int[] arr) {
            int maxSum = 0;
            //获取数组大小,即循环大小
            int length = arr.length;
            //第一重循序,0 ~ length
            for (int i = 0; i < length; i++) {
                //每次求和前,将thisSum重置为0
                //第二重循序,i ~ length,获取子列的同时开始累加
                int thisSum = 0;
                for (int j = i; j < length; j++) {
                    thisSum += arr[j];
                    if (thisSum > maxSum) {
                        maxSum = thisSum;
                    }
                }
            }
            return maxSum;
        }

    方法三:分而治之思想

    思路较复杂,有兴趣的可以百度一下。

    方法四:在线处理

    一次遍历即求出最大子列和。

    时间复杂度为O(n)

    思路:将数组从头开始遍历累加,当前和thisSum > maxSum时,那么记录maxSum = thisSum。

         当前和thisSum 为负数时,抛弃当前和thisSum(任何负的子序列都不可能是最大子序列的前缀,所以可以知道,只要是首位元素为负数的肯定不是最大子列的组成部分),

    将thisSum=0,重新开始累加,直至thisSum > maxSum。

        public  int getMaxSum(int[] arr) {
            int thisSum = 0, maxSum = 0;
            for (int i = 0; i < arr.length; i++) {
                thisSum += arr[i];
                if (thisSum > maxSum) {
                    maxSum = thisSum;
                } else {
                    thisSum = 0;
                }
            }
            return maxSum;
        }
  • 相关阅读:
    CString与char *互转总结
    string 与char* char[]之间的转换
    VC++下使用SQLite数据库
    VC连接数据库方式
    C/C++中判断某一文件或目录是否存在
    漂亮的CSS按钮样式集以及在线生成工具
    PhpStorm 4.0 & 5.0 部署本地Web应用 (转)
    PHP的serialize序列化数据与JSON格式化数据
    c/c++中产生随机数
    [STL系列]开篇简单介绍
  • 原文地址:https://www.cnblogs.com/ethan-37/p/13035043.html
Copyright © 2011-2022 走看看