博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
01-复杂度2 Maximum Subsequence Sum
阅读量:4580 次
发布时间:2019-06-09

本文共 1744 字,大约阅读时间需要 5 分钟。

  这道题和前面的“最大子列和”例题非常相似,但难点在于除了输出最大子列和这个数值之外,还需要输出该最大子列的首末两个数值。如何确定这个最大子列的首末位置是关键。

  按照前文所述的“在线处理”方法,找到目标子列的末尾位置比较简单,因为每当ThisSum大于原有的MaxSum进行“更新”时,最大子列也在“生长”到当前数值,当前累加入的这个数就是目前最大子列的末尾数。所以只需在ThisSum新赋值给MaxSum时,将MaxIndex(用于储存最大子列末位置的下标数值)更新为当下加进来数的下标i。

  那么如何找到最大子列的首位置呢?我用的方法是关注每次ThisSum重置为0时的点。因为ThisSum只会在自身数值小于0时进行重置,那么此刻它累加的、使自己小于0的这个数,一定不可能是最大子列和的开始值。那最大子列和的开始值只可能从这个数之后产生,且只要之后的那一个数是正数,它就有可能是最大子列和的起始位置数值(只要是正数后面都有越加越大的可能),所以我将(i + 1)位置设为tmpMinIndex(可能的最大子列起始下标)。何时tmpMinIndex最终确认为MinIndex呢,是在当ThisSum更新为MaxSum时,因为更新的这个ThisSum就是从tmpMinIndex那个位置开始从0累加的,它既然能成为MaxSum了说明它从0开始(tmpMinIndex位置)加的这一连串就是当下最大子列,所以这时tmpMinIndex就是整个序列中这个最大子列的MinIndex了。

  想通之后只要在前一题代码基础上加几行即可:

void MaxSubSumWithIndex(int List[], int K){    int i;    int MaxIndex = 0, MinIndex = 0, tmpMinIndex = 0;    int ThisSum = 0, MaxSum = -1;    for(i = 0; i < K; i++){        ThisSum += List[i];        if (ThisSum > MaxSum){            MaxSum = ThisSum;            MaxIndex = i;            MinIndex = tmpMinIndex;        }else if(ThisSum < 0){            ThisSum = 0;            tmpMinIndex = i + 1;        }    }    if(MaxSum >= 0)      printf("%d %d %d\n", MaxSum, List[MinIndex], List[MaxIndex]);    else      printf("0 %d %d\n", List[0], List[K - 1]);}

  这里需特别注意输出部分,因为题目中说“If all the K numbers are negative, then its maximum sum is defined to be 0, and you are supposed to output the first and the last numbers of the whole sequence.”(当输入的这K个数全为负时,输出的最大子列和应为0,并输出整个输入序列的首尾两个数)。那就需要对应MaxSum >= 0和MaxSum < 0的情况,之所以要把 = 0的情况放到前者,是因为 = 0可能是输入序列中有0有负的结果,比如输入6个数-2,0,-1,0,0,0。那最大子列和也是0但是显然不应输出题意要求的全为负情况下的首末两个数(-2和0)而是输出正常比较后的0和0(对应下标都为1)。

  这也涉及到和前一题不同的MaxSum初值问题,因为输入全为负的情况下,累加时ThisSum不断重置为0,MaxSum保持不变,最后直接进入输出的else情况,符合题意。

转载于:https://www.cnblogs.com/biankun/p/8530813.html

你可能感兴趣的文章
Oracle 块修改跟踪 (Block Change Tracking) 说明
查看>>
阿里云 Redis 服务遇到的问题
查看>>
Jwt Token 安全策略使用 ECDSA 椭圆曲线加密算法签名/验证
查看>>
Window2008通过web.config进行限制ip访问
查看>>
浅析门户网站体育赛事CDN加速解决方案
查看>>
启动/关闭xp_cmdshell
查看>>
[PY3]——内置数据结构(8)——解构与封装
查看>>
进程、单线程和多线程
查看>>
python入门(3)python的解释器
查看>>
maven入门(1-3)构建简单的maven项目
查看>>
git 清除本地无效的分支
查看>>
poj1001--Exponentiation
查看>>
Python基础(迭代)
查看>>
webpack -p无效解决方式
查看>>
使用 PHP 获得网页内容 GET方式
查看>>
TJU Problem 2857 Digit Sorting
查看>>
C# 修饰符
查看>>
Centos以rpm方式进行安装MySql
查看>>
java中使用session的一些细节
查看>>
浏览器输入服务器端口号来访问html网页
查看>>