问题描述:给定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;
}

01-最大子列和问题(java)的更多相关文章

  1. PAT复杂度_最大子列和问题、最大子列和变种

    01-复杂度1. 最大子列和问题 给定K个整数组成的序列{ N1, N2, ..., NK },“连续子列”被定义为{ Ni, Ni+1, ..., Nj },其中 1 <= i <= j ...

  2. 01-复杂度1 最大子列和问题(剑指offer和PAT)

    01-复杂度1 最大子列和问题   (20分) 给定KK个整数组成的序列{ N​1​​, N​2​​, ..., N​K​​ },“连续子列”被定义为{ N​i​​, N​i+1​​, ..., N​ ...

  3. 最大子列和CT 01-复杂度2 Maximum Subsequence Sum

    Given a sequence of K integers { N​1​​, N​2​​, ..., N​K​​ }. A continuous subsequence is defined to ...

  4. c++——最大子列和

    最大子列和问题 //O(N^3) int MaxSubseqSum1(int A[],int N){ ; int i,j,k; ;i<N;i++){ for(j=i;j<N;j++) Th ...

  5. PAT A1007 Maximum Subsequence Sum (25 分)——最大子列和,动态规划

    Given a sequence of K integers { N​1​​, N​2​​, ..., N​K​​ }. A continuous subsequence is defined to ...

  6. PATtest1.3:最大子列和

    题目源于:https://pintia.cn/problem-sets/16/problems/663 题目要求:输入一个数列,求其最大子列和. 问题反馈:1.部分C++代码不是很熟练 2.没有仔细读 ...

  7. PTA 最大子列和问题(10 分)

    最大子列和问题(10 分) 给定K个整数组成的序列{ N​1​​, N​2​​, ..., N​K​​ },“连续子列”被定义为{ N​i​​, N​i+1​​, ..., N​j​​ },其中 1≤ ...

  8. PTA 01-复杂度1 最大子列和问题 (20分)

    题目地址 https://pta.patest.cn/pta/test/15/exam/4/question/709 5-1 最大子列和问题   (20分) 给定KK个整数组成的序列{ N_1N​1​ ...

  9. # 095 01 Android 零基础入门 02 Java面向对象 02 Java封装 01 封装的实现 03 # 088 01 Android 零基础入门 02 Java面向对象 02 Java封装 03 封装总结 01 封装知识点总结

    095 01 Android 零基础入门 02 Java面向对象 02 Java封装 01 封装的实现 03 # 088 01 Android 零基础入门 02 Java面向对象 02 Java封装 ...

随机推荐

  1. Linux下安装vim-plug报错:Failed to connect to raw.githubusercontent.com port 443: Connection refused

    安装vim-plug时,输入以下命令: curl -fLo ~/.vim/autoload/plug.vim --create-dirs https://raw.githubusercontent.c ...

  2. 小谢第2问:后端返回为数组list时候,怎么实现转为tree

    要求后端返回给我的list时候,在数组中定义有id , parentid, 可以用双重循环的方法,得到tree需要的数据结构,这样得到的数据就可以直接复制给树组件的data啦const oldData ...

  3. Salesforce LWC学习(十七) 前端知识之 onclick & onblur & onmousedown

    在Salesforce LWC学习(八) Look Up组件实现篇中,我们实现了公用的lookup组件,使用的过程中,会发现当我们输入内容以后,搜索出来的列表便无法被清空. 针对此种情况我们打算优化一 ...

  4. Chisel3 - bind - PortBinding

    https://mp.weixin.qq.com/s/NaInHsJgOwG03BLNF-wlxQ   介绍Module输入输出端口如何进行绑定.   ​​     1. IO()   在定义一个模块 ...

  5. Java实现 LeetCode 733 图像渲染(DFS)

    733. 图像渲染 有一幅以二维整数数组表示的图画,每一个整数表示该图画的像素值大小,数值在 0 到 65535 之间. 给你一个坐标 (sr, sc) 表示图像渲染开始的像素值(行 ,列)和一个新的 ...

  6. Java实现 LeetCode 503 下一个更大元素 II

    503. 下一个更大元素 II 给定一个循环数组(最后一个元素的下一个元素是数组的第一个元素),输出每个元素的下一个更大元素.数字 x 的下一个更大的元素是按数组遍历顺序,这个数字之后的第一个比它更大 ...

  7. Java实现LeetCode_0013_RomanToInteger

    package javaLeetCode.primary; import java.util.HashMap; import java.util.Map; import java.util.Scann ...

  8. Java实现 洛谷 P1047 校门外的树

    import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner sc = ...

  9. java实现杨辉三角系数

    ** 杨辉三角系数** (a+b)的n次幂的展开式中各项的系数很有规律,对于n=2,3,4时分别是:1 2 1, 1 3 3 1,1 4 6 4 1.这些系数构成了著名的杨辉三角形: 1 1 1 1 ...

  10. PyQt5中QTableView函数讲解

    如果想熟悉QTableWidget,请参考PyQt5高级界面控件之QTableWidget(四) setSpan(int, int, int, int)四个参数分别代表,起始行,列,合并的行数,全并的 ...