关于序列的面试题2------------最大连续子序列和以及积
2013-05-21 21:38
176 查看
问题1描述
求取数组中最大连续子序列和,例如给定数组为A={1, 3, -2, 4, -5}, 则最大连续子序列和为6,即1+3+(-2)+ 4 = 6。有O(n3), O(n2), O(nlogn), O(n)各种复杂度不同的解法。这里就说下复杂度最低的解法吧。但是其它复杂度的方法也很重要,因为可以应用到一些变种的问题上。
方法如下:
/*最大连续子序列和*/ #include <stdio.h> #include <stdlib.h> int maxsequence(int a[], int len) { int max = a[0]; int sum = a[0]; for(int i = 1; i < len; i++) { if(sum <= 0) sum = a[i]; else sum += a[i]; if(sum > max) max = sum; } return max; } int main() { int a[10] = {4, -2, 8, -3, -6, 4, -5, 2, -1, 4}; printf("%d\n", maxsequence(a, 10)); int b[10] = {-4, -2, -8, -3, -6, -4, -5, -2, -1, -4}; printf("%d\n", maxsequence(b, 10)); system("pause"); return 0; }
问题2描述
求取数组中最大连续子序列积。解题思路跟上面的类似
方法如下:
/* 最大连续子序列积 */ int maxproduct(int a[], int len) { int max = a[0]; int product = a[0]; for(int i = 1; i < len; i++) { if(product == 0) product = a[i]; else product *= a[i]; if(product > max) max = product; } product = a[len-1]; for(int i = len - 2 ; i >= 0; i--) { if(product == 0) product = a[i]; else product *= a[i]; if(product > max) max = product ; } return max; } int main() { int a[5] = {3, -4, -5, 6, -2}; printf("%d\n", maxproduct(a, 5)); int b[6] = {2, -3, -4, 0, 6, -2}; printf("%d\n", maxproduct(b, 6)); system("pause"); return 0; }
变种问题:
BAT大神在hulu二面的第二道面试题: 求数组绝对值和最小的连续子序列。这道题要参考问题1 复杂度O(n2)的方法
可以将这个连续数组用另外一个数组表示,一趟遍历就能构造这个数组
for(i = 1; i <= n; i++) S[i] = S[i-1] + a[i];
然后这个问题就变成了求数组S中任意两个数之差绝对值最小。
下面就简单了, 对数组S进行排序,找相邻最小差值。 复杂度为O(n + nlgn)
代码如下:
int cmp(const void* a, const void* b) { return *(int *)a - *(int *)b; } int minabsolute(int a[], int len) { int S[100]; S[0] = 0; for(int i = 1; i <= len; i++) S[i] = S[i-1] + a[i-1]; qsort(S, len+1, sizeof(int), cmp); int min = S[1] - S[0]; for(int i = 2; i < len; i++) { if(S[i] - S[i-1] < min) min = S[i] - S[i-1]; } return min; } int main() { int a[5] = {3, -4, -5, 9, -2}; printf("%d\n", minabsolute(a, 5)); int b[6] = {2, -3, -4, 2, 6, -2}; printf("%d\n", minabsolute(b, 6)); system("pause"); return 0; }
相关文章推荐
- 关于最大连续子序列问题的解法
- 关于最大子序列和问题以及相关衍生问题的分析
- C++ 关于最大连续子序列(和最大)问题
- 关于最大连续子序列和的问题 (Maximum Subsequence Sum Problem)
- 关于最大连续子序列问题
- 关于最大连续子序列问题
- 关于求最大连续子序列 和 问题
- hdoj--1231--最大连续子序列
- [acm]动态规划-最大连续子序列
- 求最大连续子序列的和
- [HDOJ1231]最大连续子序列
- hud 1003 最大连续子序列和
- 关于求解最大子序列和问题的总结
- 动态规划---hdu1231---最大连续子序列
- 题目1011:最大连续子序列
- PAT程序设计考题——甲级1007 (最大连续子序列和)
- HDU__1003Max Sum(最大连续子序列和)
- 最大连续子序列的和【线性在线算法】
- //hdu 1231 最大连续子序列 (动态规划)
- 动态规划:最大连续子序列乘积 分类: c/c++ 算法 2014-09-30 17:03 656人阅读 评论(0) 收藏