给定一个整数序列,求出子段序列的最大和,也就是一段连续和元素的和,使其和最大,(如果
发布网友
发布时间:2022-04-18 10:56
我来回答
共3个回答
懂视网
时间:2022-04-18 15:17
时间复杂度为O(n)
只需要过一遍数组即可,但是需要深入理解这个数组的本质特征,即动态规划的方法。
首先设置两个变量,thisSum和maxSum。其中thisSum表示走到当前位置元素的和;maxSum表示走到当前位置下的连续子序列的最大和。
注意:如果thisSum为负,则直接将其置为0;如果thisSum大于maxSum,则将maxSum置为thisSum的值。
public static int maxSubArray(int[] nums)
{
int length = nums.length;
if(length <= 0)
return 0;
int CurSum = 0;
int max = Integer.MIN_VALUE;
for(int i = 0; i < length; i++)
{
if(CurSum <= 0) //当当前的和小于等于0,那么就给其置为当前元素的值
CurSum = nums[i];
else
CurSum += nums[i];
if(CurSum > max)
max = CurSum;
}
return max;
}
推荐教程:PHP教程
热心网友
时间:2022-04-18 12:25
#include <stdio.h>
int MaxSum(int *a,int n) {
int i,sum = 0,max = 0;
bool flag1 = false,flag2 = false;
for(i = 0;i < n;i++) {
if(a[i] > 0) flag1 = 1;
if(a[i] < 0) flag2 = 1;
}
if(flag1 && flag2) { // 序列中有正数,也有负数
for(i = 0;i < n;i++) {
if(a[i] < 0) {
if(max < sum) {
max = sum;
sum = 0;
}
}
else sum += a[i];
}
if(max < sum) max = sum;
}
else if(flag1 && !flag2) { // 全部为正
for(i = 0;i < n;i++) max += a[i];
}
else if(!flag1 && flag2) {
max = a[0];
for(i = 1;i < n;i++) {
if(a[i] > max) max = a[i];
}
}
else max = 0; // 全部为零
return max;
}
int main() {
int a[] = {31,-98,45,77,89,12,-92,88,80,120};
for(int i = 0;i < 10;i++) printf("%d ",a[i]);
printf("\nMAX = %d\n\n",MaxSum(a,10));
return 0;
}
热心网友
时间:2022-04-18 13:43
上面的解答明显不是满足连续和最大的解:如:int a[] = {31,-98,45,77,89,12,-92,88,80,120};是你自己给的例子,那么按照你的算法得出的Max=288;那么45,77,89,12,-92,88,80,120的和是多少呢?显然大于288.(注意这几个数的和45,77,89,12,-92大于零)。下面我给出本人的代码:
#include<stdio.h>
int main(){
int max,sum,n,x;
while(scanf("%d",&n)!=EOF){
sum=0;
max=0;
while(n--){
scanf("%d",&x);
sum+=x;
if(sum>0){//sum大于0
if(sum>max){//sum大于max则sum赋值给max,否则继续加下一个数
max=sum;
}
}
else{//sum<0,置sum为0
sum=0;
}
}
printf("%d\n",max);
}
return 0;
}
如3 2 -7 6 5 -10 3,求其中连续数字最大的和的过程如下:
设两个变量,sum和max。
sum 从前往后做相加运算,如果sum为正,则max和sum比较,取较大的放入max;如果sum小于max,则继续向后加;如果sum小于0,则sum清除为0。对于上述数组,
1.
sum = 3
max = 3
sum = 5
max = 5
sum = -2
max =5 sum = 0
sum = 6
max = 6
sum = 11
max = 11
sum = 1
max = 11
sum = 4
max = 11
则最大数是11
...那么,与人类相伴随的价值又是从何进化而来的呢?
然而,这些生理机制和行为机制的调整,以适应生态元素不足在一定程度上,生物体必然要消耗更多的食物能量,即成本的额外的能量消耗的食物,它可以被翻译成食物中的能量的数量,也就是等于额外消耗的食物能量为负的值的活的生物体的生态元素的缺乏。 当这些生态元素在一定程度上有盈余,生物体可以在一定程度上和一段时间保存...
计算机二级C语言考试总分多少?几分能过?
1、线性表由一组资料元素构成,资料元素的位置只取决于自己的序号,元素之间的相对位置是线性的。线性表是由n(n≥0)个数据元素组成的一个有限序列,表中的每一个数据元素,除了第一个外,有且只有一个前件,除了最后一个外,有且只有一个后件。线性表中资料元素的个数称为线性表的长度。线性表可以为空表。 *:线...
数据结构的问题~
A 一个有限序列,可以为空 B 一个有限序列,不能为空 C 一个无限序列,可以为空 D 一个无限序列,不能为空 2 在一个长度为n的顺序表中,向第iI个元素(1≤i≤n+1)位置插入一个新元素时,需要从后向前依次后移( )个元素。 A n-i B n-i+1 C n-i-1 D i 3 在一个顺序表的表尾插入一个元素的时...
...将网络划分为1000个子网,请写出子网掩码和最大的子网地址?
1000个子网,那么就学要2的10次方1024,也就是说要从主机位中取出10位作为子网位,此时子网掩码的位数就变味8+10=18位,再根据连续1和0,前面18位全为1,后面14位全为0就可以得出子网掩码了255.255.192.0,最大子网就是取出的10位中都为1,即为11.255.192.0 ...
...1<=ai<=32768), 请你从中找出最长的一段连续序列
using namespace std;int main(){ int n,i=0,j=0,num=0,a[100000],cnt=0;long k,f=0;while (cin>>n>>k&&n!=0||k!=0){ for (i = 0; i < n; i++) { cin >> a[i];} for (i = 0; i < n; i++) { num = 0;j=i;f = a[i];while (f<=k&&j+1<n)...
各大公司笔试题及答案
如果中数所在范围出现的整数比较少,我们就可以对这个范围内的整数进行排序,找到中数。如果这个范围内出现的整数比较多,我们还可以采用同样的方法将此范围再次分成多个更小的范围(256M=2^28,所以最多需要3次就可以将此范围缩小到1,也就找到了中数)。腾讯笔试题:两个整数集合A和B,求其交集两个整数集合A和B,求其...
编写一个函数,输和一行字符,将此字符串中最长的单词输出
5. C语法限制不太严格,程序设计自由度大 虽然C语言也是强类型语言,但它的语法比较灵活,允许程序编写者有较大的自由度。 6. C语言允许直接访问物理地址,可以直接对硬件进行操作 因此既具有高级语言的功能,又具有低级语言的许多功能,能够象汇编语言一样对位、字节和地址进行操作,而这三者是计算机最基本的工作单元,...
求数学五年级下册的应用题,越多越好 急!!!
5、一个长方体油桶,底面积是18平方分米,它可装43.2千克油,如果每升油重0.8千克,油桶的高是多少分米? 6、在一只长25厘米,宽20厘米的玻璃缸中,有一块棱长10厘米的正方体铁块,这时水深15厘米,如果把这块铁块从缸中取出来,缸中的水深多少厘米? 7、一个长方体油箱,底面是一个正方形,从里面量边长是6分米。
什么叫有限集合、可列集和可列有限集。看了以下定义,我还不是很懂,请 ...
二,可列与不可列的问题 (1)并不是所有无限集合都和全体自然数,也就是基数为(aleph)零的无限数能构成一一对应。比如,实数。当然全体实数也是无限的,但它却和自然数之间构造不出一一对应关系。所以,在全体实数这个无穷之上,还有更大的无穷。也就是说,(aleph零)<2^(aleph零),我们叫,2^(...
如何在c++定义一个学生类以实现平均成绩的计算和查询功能?
但这个也不能说是中间件的锅,在软件定义汽车大大趋势下,这几乎是必然的。二.常见的基本概念1. AUTOSAR CP 与 AUTOSAR AP在所有的中间件方案中,最著名的非AUTOSAR莫属了。严格地说,AUTOSAR并非特指由某一家软件公司开发出来的某款操作系统或中间件产品,而是由全球的主要汽车生产厂商、零部件供应商、软硬件和...