题目:给定N个整数序列{A1,A2,A3,...,An},求出子序列(例:Ai-Aj,必须是连续的)中的最大值

下面给出此题的四种解决办法,且时间复杂度依次增加。

  • 方法一
 public int maxSubsequenceSum4(int[] list, int n){int thisSum = 0;//当前子序列和int maxSum = 0;//目前最大子序列和for (int i = 0; i < n; i++){thisSum += list[i];if (thisSum > maxSum){//当发现更大的子序列和时,替换此前的和maxSum = thisSum;}/*当当前子序列和加上一个绝对值大于它的负数时,此子序列变成负数,*此时应当抛弃该子序列,重新以下一个整数为开头寻找下一个子序列.*例如:1,3,-5,4,2,-1,...*显然子序列A1,A2,A3的和为负数,此时应当抛弃A1,A2,A3...(注意:此时maxSum为A1,A2的和)*并以A4...开始寻找下一个合适的子序列**/else if (thisSum < 0){thisSum = 0;}}return maxSum;}
  • 方法二
 int Max3( int A, int B, int C ){ /* 返回3个整数中的最大值 */return A > B ? A > C ? A : C : B > C ? B : C;}int DivideAndConquer(int[] list, int left, int right ){ /* 分治法求list[left]到list[right]的最大子列和 */int MaxLeftSum, MaxRightSum; /* 存放左右子问题的解 */int MaxLeftBorderSum, MaxRightBorderSum; /*存放跨分界线的结果*/int LeftBorderSum, RightBorderSum;int center, i;if( left == right )  { /* 递归的终止条件,子列只有1个数字 */if( list[left] > 0 )  return list[left];else return 0;}/* 下面是"分"的过程 */center = ( left + right ) / 2; /* 找到中分点 *//* 递归求得两边子列的最大和 */MaxLeftSum = DivideAndConquer( list, left, center );MaxRightSum = DivideAndConquer( list, center+1, right );/* 下面求跨分界线的最大子列和 */MaxLeftBorderSum = 0; LeftBorderSum = 0;for( i=center; i>=left; i-- ) { /* 从中线向左扫描 */LeftBorderSum += list[i];//子序列为list[center],list[center-1],...if( LeftBorderSum > MaxLeftBorderSum )MaxLeftBorderSum = LeftBorderSum;} /* 左边扫描结束 */MaxRightBorderSum = 0; RightBorderSum = 0;for( i=center+1; i<=right; i++ ) { /* 从中线向右扫描 */RightBorderSum += list[i];//子序列为list[center+1],list[center+2],...if( RightBorderSum > MaxRightBorderSum )MaxRightBorderSum = RightBorderSum;} /* 右边扫描结束 *//* 下面返回"治"的结果 */return Max3( MaxLeftSum, MaxRightSum, MaxLeftBorderSum + MaxRightBorderSum );}int maxSubsequenceSum3(int[] list, int N ){ /* 保持与前2种算法相同的函数接口 */return DivideAndConquer( list, 0, N-1 );}

同样举例说明方法二

4 -3 5 -2 -1 2 6 -2

以上为八个整数序列,下面用方法二求出八个整数序列的最大子序列
函数执行顺序图如下:


递归先由最后分割到不可再分时,求出分割线两侧数据的值

if( left == right )  { /* 递归的终止条件,子列只有1个数字 */if( list[left] > 0 )  return list[left];else return 0;}

然后再返回上一层调用函数,求出左右两部分的子序列最大值。注意:分割线两侧数据为起始数据
该方法主要就是以分割线两侧数据为起始数据,两边分散(不中断)求左右子序列的和
最后跨分割线子序列最大值左侧最大值+右侧最大值(例如:(A1,A2,A3,A4),左侧:A1,A2右侧:A3,A4.假设其左侧最大子序列和为A2,A1,右侧大子序列和为A3,则跨分割线子序列最大值为A1,A2,A3)

/* 下面求跨分界线的最大子列和 */MaxLeftBorderSum = 0; LeftBorderSum = 0;for( i=center; i>=left; i-- ) { /* 从中线向左扫描 */LeftBorderSum += list[i];//子序列为list[center],list[center-1],...if( LeftBorderSum > MaxLeftBorderSum )MaxLeftBorderSum = LeftBorderSum;} /* 左边扫描结束 */MaxRightBorderSum = 0; RightBorderSum = 0;for( i=center+1; i<=right; i++ ) { /* 从中线向右扫描 */RightBorderSum += list[i];//子序列为list[center+1],list[center+2],...if( RightBorderSum > MaxRightBorderSum )MaxRightBorderSum = RightBorderSum;} /* 右边扫描结束 */

最后返回三个数据的最大值,即最大子序列和

        /* 下面返回"治"的结果 */return Max3( MaxLeftSum, MaxRightSum, MaxLeftBorderSum + MaxRightBorderSum );
  • 方式三
public int maxSubsequenceSum2(int[] list, int n){int thisSum = 0;int maxSum = 0;for (int i = 0; i < n; i++){//循环n次,每次循环表示以Ai为子序列的起始数据thisSum = 0;for (int j = i; j < n; j++){thisSum += list[j];//子序列为Ai,Ai+1,...if (thisSum > maxSum){maxSum = thisSum;}}}return maxSum;}
  • 方法四

时间复杂度T(n)=n3

public int maxSubsequenceSum1(int A[],int n){int thisSum = 0;int maxSum = 0;for (int i = 0; i < n; i++){for (int j = i; j < n; j++){thisSum = 0;for (int k = i; k <= j; k++ ){thisSum += A[k];if (thisSum > maxSum){maxSum = thisSum;}}}}return maxSum;}

代码来自MOOC网浙江大学数据结构课程,本人稍作修改整理以及加上自己的解释

给定N个整数序列{A1,A2,A3,...,An},求出子序列(例:Ai-Aj,必须是连续的)中的最大值相关推荐

  1. 一道题:给定一整数序列A1,A2,...,An(可能有负数),求A1到An的一个自序列,使得Ai到Aj的和最大。例如:整数序列-2,11,-4,13,-5,2,-5,-3,12,-9的最大子序列为21

    给定一整数序列A1,A2,-,An(可能有负数),求A1到An的一个自序列,使得Ai到Aj的和最大.例如:整数序列-2,11,-4,13,-5,2,-5,-3,12,-9的最大子序列为21(从A2到A ...

  2. 蓝桥杯真题 求和 给定 n 个整数 a1· a2, · · · , an,求它们两两相乘再相加的和

    求和 问题描述 给定 n 个整数 a1, a2, · · · , an ,求它们两两相乘再相加的和,即: S=a1·a2+a1·a3+···+a1·an+a2·a3+···+an-2·an+an-1· ...

  3. 给定N个加号,M个减号以及N+M+1个整数,A1+A2+...+Am+An+1,小明想知道在所有由这n个加号,M个减号以及N+M+1个整数凑出的合法的后缀表达式中,结果最大的是哪一个?

    问题;给定N个加号,M个减号以及N+M+1个整数,A1+A2+-+Am+An+1,小明想知道在所有由这n个加号,M个减号以及N+M+1个整数凑出的合法的后缀表达式中,结果最大的是哪一个? 请输出这个最 ...

  4. Python(分治算法)问题 F: 求逆序对_给定一个序列a1,a2,…,an,如果存在i<j并且ai>aj,那么我们称之为逆序对,求逆序对的数目。

    问题 F: 求逆序对 题目描述 给定一个序列a1,a2,-,an,如果存在i<j并且ai>aj,那么我们称之为逆序对,求逆序对的数目. 注意:n<=10^5,ai<=10^5 ...

  5. A0/A1/A2/A3/A4图纸大小分别是多少

    原文地址::http://zhidao.baidu.com/question/291959816.html 我们国家的标准是按A0,A1...来分的,美国标准是按A,B,C,D,E来分的. A0=11 ...

  6. A1,A2,A3,A4纸的尺寸

    A1,A2,A3,A4纸的尺寸谁知道阿? 悬赏分:0 - 解决时间:2006-11-21 15:51 急用 提问者: 夕峰客 - 举人 四级 最佳答案 A0=1189*841 A1=841*594 A ...

  7. A1,A2,A3,A4纸的尺寸大小|A4纸与分辨率的关系|像素换算|ABC号纸尺寸|纸张幅面规格

    纸张幅面规格: 纸张的规格是指纸张制成后,经过修整切边,裁成一定的尺寸.过去是以多少"开"(例如8开或16开等)来表示纸张的大小,现在我采用国际标准,规定以A0.A1.A2.B1. ...

  8. NR Measurements-- 切换测量A1 A2 A3 A4 A5 B1 B2

    NR的切换机制和LTE几乎一样,大部分情况下采取基站控制,终端辅助完成: 第一步:基站向UE 下发测量控制 measConfig,测量控制以measId的形式下发给UE,每个measId包括两个元素: ...

  9. (a1,a2,a3,...,an-2,an-1,an)排列成(a1,an,a2,an-1,a3,an-2)

    /*设线性表L=(a1,a2,a3,...,an-2,an-1,an)采用带头结点的单链表保存,链表的结构为data.next.请设计一个 空间复杂度为O(1)且时间上尽可能高效的算法,重新排列L中的 ...

  10. 网易之小易最近在数学课上学习到了集合的概念,集合有三个特征:1.确定性 2.互异性 3.无序性.需要根据给定的w,x,y,z,求出集合中一共有多少个元素。

    import java.util.HashSet; import java.util.Scanner; import java.util.Set;/*** 小易最近在数学课上学习到了集合的概念,集合有 ...

最新文章

  1. emwin读取sd图片_262.3MB/S读取速率,雷克沙1667X这回谁还敢吐槽
  2. ImageNet Classification with Deep Convolutional Nerual Networks(AlexNet)
  3. 浅谈Excel开发:九 Excel 开发中遇到的常见问题及解决方法
  4. Element el-upload上传组件详解
  5. java 线程 wait 一定要同步_Java 线程中调用wait为什么一定要在同步代码块中?
  6. 2017-8-22 训练日记
  7. LOJ洛谷P1248加工生产调度(贪心、Johnson 法则)
  8. Silverlight的自定义tooltip提示工具条
  9. mybatis 学习一 建立maven项目
  10. php设置编程,php – 以编程方式设置基本图像
  11. 【学习笔记-1】- 非线性规划的最优性一阶/二阶必要条件之例题(12道)
  12. stylecloud:一款可以制作个性化词云图的 Python 神器
  13. ArcBlock 将作证支持美国华盛顿州区块链立法 | ABT 活动
  14. GCTA学习8 | GCTA计算多性状遗传力和遗传相关
  15. ECharts数据可视化项目
  16. 支持NDS的视频音频转换软件Xilisoft Video Converter
  17. 图表嵌入到数据表格下方_在excel图表下方添加数据表 excel图表添加数据表
  18. GAN相关模型和论文
  19. 技术资料收集 技术大牛及网站推荐 待研究方向
  20. The 2021 Sichuan Provincial 四川省赛 L. Spicy Restaurant(多源bfs)

热门文章

  1. quartz mysql死锁问题_关于quartz 并发持久化异常--事务(进程 ID 56)与另一个进程被死锁在 锁 资源上,并且已被选作死锁牺牲品。请重新运行该事务...
  2. iis安装后没有信息服务器,iis安装没有ftp服务器
  3. Python中的是是非非与真真假假
  4. 用自己任意的图片制作适合的Android图标分享
  5. 手机发射机的功能电路(1)---发射机框架结构
  6. 谷歌员工痛批公司“官僚气息”太重,CEO 皮查伊迫于无奈回应称“正面临挑战”
  7. 谷歌CEO:比编程能力更重要的是持续学习
  8. 包装类、基本数据类型、String之间的转换 自动拆箱与装箱
  9. php windows信号,电脑怎么切换hdmi信号
  10. 被《硅谷》选中的“压缩算法”,为什么说下一个机器学习杀手应用将由此诞生...