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;
}
01-最大子列和问题(java)的更多相关文章
- PAT复杂度_最大子列和问题、最大子列和变种
01-复杂度1. 最大子列和问题 给定K个整数组成的序列{ N1, N2, ..., NK },“连续子列”被定义为{ Ni, Ni+1, ..., Nj },其中 1 <= i <= j ...
- 01-复杂度1 最大子列和问题(剑指offer和PAT)
01-复杂度1 最大子列和问题 (20分) 给定KK个整数组成的序列{ N1, N2, ..., NK },“连续子列”被定义为{ Ni, Ni+1, ..., N ...
- 最大子列和CT 01-复杂度2 Maximum Subsequence Sum
Given a sequence of K integers { N1, N2, ..., NK }. A continuous subsequence is defined to ...
- c++——最大子列和
最大子列和问题 //O(N^3) int MaxSubseqSum1(int A[],int N){ ; int i,j,k; ;i<N;i++){ for(j=i;j<N;j++) Th ...
- PAT A1007 Maximum Subsequence Sum (25 分)——最大子列和,动态规划
Given a sequence of K integers { N1, N2, ..., NK }. A continuous subsequence is defined to ...
- PATtest1.3:最大子列和
题目源于:https://pintia.cn/problem-sets/16/problems/663 题目要求:输入一个数列,求其最大子列和. 问题反馈:1.部分C++代码不是很熟练 2.没有仔细读 ...
- PTA 最大子列和问题(10 分)
最大子列和问题(10 分) 给定K个整数组成的序列{ N1, N2, ..., NK },“连续子列”被定义为{ Ni, Ni+1, ..., Nj },其中 1≤ ...
- PTA 01-复杂度1 最大子列和问题 (20分)
题目地址 https://pta.patest.cn/pta/test/15/exam/4/question/709 5-1 最大子列和问题 (20分) 给定KK个整数组成的序列{ N_1N1 ...
- # 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封装 ...
随机推荐
- PowerPC-MPC56xx Flash模式启动过程
https://mp.weixin.qq.com/s/SpBOfzJJ1OizYP-rsLJVqQ Flash启动模式为最常用模式. 一般情况下,芯片上电之后,从flash起始位置读取第一条指令的 ...
- pycharm关联git
一.先创建SSH Key 给github设置SSH-KEY !!! 这一步算是连接GitHub的最基本的一步了,git是分布式的代码管理工具,远程的代码管理是基于ssh的,所以得先配好SSH key. ...
- Docker容器同步主机时间
方法一: 查看本地是否有/etc/localtime文件 cat /etc/localtime 如果没有就新建文件 cp /usr/share/zoneinfo/Asia/Shanghai /et ...
- OkHttp,一次无奈的使用
一次使用OKHTTP的心痛历程 最近由于一些不得已的原因,接触到了OKHttp,说起来也挺Dan疼的,之前同事将生产附件上传地址配置成了测试地址,还好数量不多,没有造成太大的影响,况且的是这位同事又离 ...
- Java实现 蓝桥杯 基础练习 数列特征
基础练习 数列特征 时间限制:1.0s 内存限制:256.0MB 提交此题 锦囊1 锦囊2 问题描述 给出n个数,找出这n个数的最大值,最小值,和. 输入格式 第一行为整数n,表示数的个数. 第二行有 ...
- Java实现 LeetCode 477 汉明距离总和
477. 汉明距离总和 两个整数的 汉明距离 指的是这两个数字的二进制数对应位不同的数量. 计算一个数组中,任意两个数之间汉明距离的总和. 示例: 输入: 4, 14, 2 输出: 6 解释: 在二进 ...
- Java实现 LeetCode 25 K个一组翻转链表
25. K 个一组翻转链表 给你一个链表,每 k 个节点一组进行翻转,请你返回翻转后的链表. k 是一个正整数,它的值小于或等于链表的长度. 如果节点总数不是 k 的整数倍,那么请将最后剩余的节点保持 ...
- 第三届蓝桥杯C++B组国(决)赛真题
解题代码部分来自网友,如果有不对的地方,欢迎各位大佬评论 题目1.星期几 1949年的国庆节(10月1日)是星期六. 今年(2012)的国庆节是星期一. 那么,从建国到现在,有几次国庆节正好是星期日呢 ...
- Java实现第八届蓝桥杯9算数式
9算数式 题目描述 观察如下的算式: 9213 x 85674 = 789314562 左边的乘数和被乘数正好用到了1~9的所有数字,每个1次. 而乘积恰好也是用到了1~9的所有数字,并且每个1次. ...
- Redis企业级数据备份与恢复方案
一.持久化配置 RBD和AOF建议同时打开(Redis4.0之后支持) RDB做冷备,AOF做数据恢复(数据更可靠) RDB采取默认配置即可,AOF推荐采取everysec每秒策略 AOF和RDB还不 ...