您的位置:首页 > 职场人生

关于序列的面试题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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: