【题目1】给一个整型数组,求最大子序列和
2009-09-15 18:59
330 查看
马上要开始找工作了,做些题目练练手。
源代码:(在VC6下通过编译,正确执行)
为了方便大家理解,这里转载一篇别人的解法,看了这篇文章之后,我对这个问题
的理解更加清晰了,在此向作者表示感谢。
最大子段和问题的动态规划求解
1. 基本原理
设数组为a[k],1≤k≤n,最大子段和X 被定义为:
j
X = max { ∑a[k] }
1≤i≤j ≤n k=i
不妨设:
j
b[j ] = max { ∑ a[k]}
1 ≤j ≤n k=m
其中m 是可变的。注意:a[j]必须是b[j]这个最大局部受限子段和所对应子段的最右端,
好好理解此处j 和b[j]的含义是整个算法的关键!
根据b[j]和X 的定义,不难发现:
X = max b[j ]
1≤j ≤n
另一方面,根据b[j]的定义,可以看出:
当b[j-1]>0 时,无论a[j]为何值,b[j]=b[j-1]+a[j];
当b[j-1]≤0 时,无论a[j]为何值,b[j]=a[j];
所以有:
b[j ] = max { b[j -1] +a[j ],a[j ] }
1≤j ≤n
2. 具体实例
k 1 2 3 4
a[k] 3 -4 2 10
b[k] 3 -1 2 12
其中:b[1]=a[1],b[2]=b[1]+a[2],b[3]=a[3],b[4]=b[3]+a[4] ;因此,对于数组a 而言,
最大子段和为b[4],即X=12 。
3. 编程实现
略,针对数组a 进行一遍扫描即可。算法实现的时间复杂度只有O(n)。
源代码:(在VC6下通过编译,正确执行)
#include <stdio.h> int FindGreatestSecSum(int *a,int len) { int sum = 0, max = 0; for(int i = 0; i < len; i++) { if(sum <= 0) sum = a[i]; else sum += a[i]; if(sum > max) max = sum; } return max; } int main() { int a[8] = {4,-3,5,-2,-1,2,6,-2}; printf("%d/n", FindGreatestSecSum(a,sizeof(a)/sizeof(int))); return 0; }
为了方便大家理解,这里转载一篇别人的解法,看了这篇文章之后,我对这个问题
的理解更加清晰了,在此向作者表示感谢。
最大子段和问题的动态规划求解
1. 基本原理
设数组为a[k],1≤k≤n,最大子段和X 被定义为:
j
X = max { ∑a[k] }
1≤i≤j ≤n k=i
不妨设:
j
b[j ] = max { ∑ a[k]}
1 ≤j ≤n k=m
其中m 是可变的。注意:a[j]必须是b[j]这个最大局部受限子段和所对应子段的最右端,
好好理解此处j 和b[j]的含义是整个算法的关键!
根据b[j]和X 的定义,不难发现:
X = max b[j ]
1≤j ≤n
另一方面,根据b[j]的定义,可以看出:
当b[j-1]>0 时,无论a[j]为何值,b[j]=b[j-1]+a[j];
当b[j-1]≤0 时,无论a[j]为何值,b[j]=a[j];
所以有:
b[j ] = max { b[j -1] +a[j ],a[j ] }
1≤j ≤n
2. 具体实例
k 1 2 3 4
a[k] 3 -4 2 10
b[k] 3 -1 2 12
其中:b[1]=a[1],b[2]=b[1]+a[2],b[3]=a[3],b[4]=b[3]+a[4] ;因此,对于数组a 而言,
最大子段和为b[4],即X=12 。
3. 编程实现
略,针对数组a 进行一遍扫描即可。算法实现的时间复杂度只有O(n)。
相关文章推荐
- 求一个整型数组中的最大连续子序列和
- 题目:返回一个整型数组中最大子数组的和—第二部
- 找出一个整型数组中的元素的最大值
- 数据结构:题目(3)测试一个数组序列是否是二叉树的前序遍历或者后序遍历结果
- 求一个整型数组的最大和的子数列,要求时间复杂度为线性的
- 给定一个整型数组,求数组中的最大数和次最大数
- 【编程题目】一个整数数组,长度为 n,将其分为 m 份,使各份的和相等,求 m 的最大值★★ (自己没有做出来!!)
- 使用一个函数找出整型数组的最大值或最小值
- 大学时候想的一个算法——计算数组中最大和序列
- 输入一个整型数组,求所有子数组中和的最大值
- 题目:给一个排序好的整数数组A,请写一个函数,输入是数组A和一个整数x,返回数组A中值小于x的最大元素的索引值
- 每日一题 一个整型数组,其中有正值有负值,请拿出其中相邻子数组中的最大值
- 【编程题目】求一个数组的最长递减子序列 比如{9,4,3,2,5,4,3,2}的最长递减子序列为{9,5, 4,3,2}
- 题目:返回一个整数数组中最大子数组的和。
- 经典面试题:求数组的最大子序列和;实现函数 :判断一个自负喜欢是否是另一个字符串旋转所得;杨氏矩阵中查找一个数。
- 有一个整型二维数组,假设a[3][4] = {初始化了值},求出这个二维数组中所有的最大值,以及最大值对应的下标。 数组内部原有的值不能改变位置。
- 题目:输入一个整形数组,数组里有正数也有负数。数组中连续的一个或多个整数组成一个子数组,每个 子数组都有一个和。求所有子数组的和的最大值。要求时间复杂度为 O(n)。
- 给一个数组,元素都是整数(有正数也有负数),寻找连续的元素相加之和为最大的序列。
- 题目:返回一个一维循环数组中最大子数组的和
- [原]Java面试题-输入一个整型数组,找出最大值、最小值,并交换。