首页
外语
计算机
考研
公务员
职业资格
财经
工程
司法
医学
专升本
自考
实用职业技能
登录
计算机
输入一个整形数组,数组里有正数也有负数。数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和。求所有子数组的和的最大值。要求时间复杂度为O(n)。 例如输入的数组为1, -2, 3, 10, -4, 7, 2, -5,和最大的子数组为3, 10,
输入一个整形数组,数组里有正数也有负数。数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和。求所有子数组的和的最大值。要求时间复杂度为O(n)。 例如输入的数组为1, -2, 3, 10, -4, 7, 2, -5,和最大的子数组为3, 10,
admin
2014-11-15
113
问题
输入一个整形数组,数组里有正数也有负数。数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和。求所有子数组的和的最大值。要求时间复杂度为O(n)。
例如输入的数组为1, -2, 3, 10, -4, 7, 2, -5,和最大的子数组为3, 10, -4, 7, 2,因此输出为该子数组的和18。
选项
答案
如果不考虑时间复杂度,我们可以枚举出所有子数组并求出他们的和。不过非常遗憾的是,由于长度为n的数组有O(n2)个子数组;而且求一个长度为n的数组的和的时间复杂度为O(n)。因此这种思路的时间是O(n3)。 很容易理解,当我们加上一个正数时,和会增加;当我们加上一个负数时,和会减少。如果当前得到的和是个负数,那么这个和在接下来的累加中应该抛弃并重新清零,不然的话这个负数将会减少接下来的和。基于这样的思路,我们可以写出如下代码。 参考代码: ///////////////////////////////////////////////////////////////////////////// // Find the greatest sum of all sub-arrays // Return value: if the input is valid, return true, otherwise return false ///////////////////////////////////////////////////////////////////////////// bool FindGreatestSumOfSubArray ( int *pData, // an array unsigned int nLength, // the length of array int &nGreatestSum // the greatest sum of all sub-arrays ) { // if the input is invalid, return false if((pData == NULL) || (nLength == 0)) return false; int nCurSum = nGreatestSum = 0; for(unsigned int i = 0; i < nLength; ++i) { nCurSum += pData[i]; // if the current sum is negative, discard it if(nCurSum < 0) nCurSum = 0; // if a greater sum is found, update the greatest sum if(nCurSum > nGreatestSum) nGreatestSum = nCurSum; } // if all data are negative, find the greatest element in the array if(nGreatestSum == 0) { nGreatestSum = pData[0]; for(unsigned int i = 1; i < nLength; ++i) { if(pData[i] > nGreatestSum) nGreatestSum = pData[i]; } } return true; } 讨论:上述代码中有两点值得和大家讨论一下: ? 函数的返回值不是子数组和的最大值,而是一个判断输入是否有效的标志。如果函数返回值的是子数组和的最大值,那么当输入一个空指针是应该返回什么呢?返回0?那这个函数的用户怎么区分输入无效和子数组和的最大值刚好是0这两中情况呢?基于这个考虑,本人认为把子数组和的最大值以引用的方式放到参数列表中,同时让函数返回一个函数是否正常执行的标志。 ? 输入有一类特殊情况需要特殊处理。当输入数组中所有整数都是负数时,子数组和的最大值就是数组中的最大元素。
解析
转载请注明原文地址:https://kaotiyun.com/show/ODmZ777K
0
程序员面试
相关试题推荐
Theimmunesystemisequalincomplexitytothecombinedintricaciesofthebrainandnervoussystem.Thesuccessoftheimmune
概述反射和序列化
删除字符串中的数字并压缩字符串(神州数码以前笔试题),如字符串”abc123de4fg56”处理后变为”abcdefg”。注意空间和效率。(下面的算法只需要一次遍历,不需要开辟新空间,时间复杂度为O(N))
两个单向链表,找出它们的第一个公共结点。链表的结点定义为:structListNode{intm_nKey;ListNode*m_pNext;};
数据库的优化设计?
在邮件中设置图片背景。
设置TCP/IP属性的首选DNS服务器地址202.112.80.106。
请给学生成绩表的某列“普通物理”设置一个链接其课程简介的超链接。
从目前技术来看,下列打印机中打印速度最快的是________。
任何一个团队从开始组建到最终达到绩效要求,需要一个周期。依据塔克曼群体发展模型,结合IT服务管理工作特性,将团队建设周期分为四个阶段,它们分别是(未按正确次序排列):①风暴期②表现期③组建期④规范期团队建设周期的正确排序为______。
随机试题
一般地,合同法上的重大误解指的是对______、_____、______、______。
简述质量成本的分类。
A、70~80℃B、40~50℃C、10~30℃D、20~10℃E、0℃中国药典规定,热水指
弗里德曼认为,货币需求量是稳定的,可以预测的,因此,货币政策应()。
设μα为标准正态分布的α分位数,则()。
甲是某地远近有名的养马专业户,乙需要买四匹马,来找甲商议。甲乙通过协商,商定四匹马共5000元,但乙不放心,甲对乙说:“你不放心可以先把马牵回去试用,如果一个月内觉得可以,你就买下来。如果觉得不满意,就把马给我牵回来,没事的。”乙很高兴,就将四匹马牵走了,
据统计,2016年共有来自205个国家和地区的442773名各类外国留学人员在31个省、自治区、直辖市的829所高等学校、科研院所和其他教学机构中学习,比2015年增加45138人。1.按洲别统计2.按国别排序前15名:韩国70540人,美国2383
从所给的四个选项中,选择最合适的一个填入问号处,使之呈现一定的规律性:
Thefollowingtableshowssomeresultsofasurveyinwhich800Japaneseschoolpupilswereaskedtogivetheirimpressionsoft
以下是班级成绩处理平台的程序流程图,请仔细阅读程序并完成要求。该平台允许最多输入100个学生的成绩,以-1作为输入结束标志。N2存放输入的学生成绩个数,N1存放输入成绩中有效成绩的个数,sum存放成绩总和。初始化N2=N1=O,sum=0。计算其中
最新回复
(
0
)