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

面试题31连续数组的最大和

2015-08-27 15:53 429 查看
面试题31连续数组的最大和
思路:最笨最直接的做法枚举数组的所有子数组并求出它们的和。长度为n的数组一共有n*(n-1)/2个子数组时间复杂度为O(n^2)
// 遍历数组同时设立两个变量cursum
和maxsum
当cursum<=0
时跟新cursum
为当前元素值。每次更新最大值maxsum的值即可
//用中规中矩的动态规划法用函数f(i)表示以第i个数字结尾的子数组的最大和。目标函数为max(f(i))
其中0<=i<n;
//f(i)=a[i] if(i==0||f(i-1)<=0)
//f(i)=f[i-1]+a[i] if(i!=0&&f(i-1)>0)
函数接口:GetGreastSumOfSubArray(int*a,int length);

#include<iostream>
#include<cstdio>
#include<cstdlib>
using namespace std;
//面试题31连续数组的最大和 思路:最笨最直接的做法 枚举数组的所有子数组并求出它们的和。长度为n的数组一共有n*(n-1)/2个子数组时间复杂度为O(n^2)
// 遍历数组同时设立两个变量cursum 和maxsum 当cursum<=0 时跟新cursum 为当前元素值。每次更新最大值maxsum的值即可
//用中规中矩的动态规划法 用函数f(i)表示以第i个数字结尾的子数组的最大和。目标函数为max(f(i)) 其中0<=i<n;
//f(i)=a[i]  if(i==0||f(i-1)<=0)
//f(i)=f[i-1]+a[i] if(i!=0&&f(i-1)>0)
bool gInvalidInput=false;
//方法一最直观的做法
int GetGreastestSumOfSubArray(int a[],int length)
{
if(a==NULL||length<=0)
{
gInvalidInput=true;
return 0;
}
int maxsum=0x80000000;//32位整形能表示的最小负整数
for(int i=0;i<length;i++)
{
int cursum=0;
for(int j=i;j<length;j++)
{
cursum+=a[j];
if(cursum>maxsum)
{
maxsum=cursum;
}

}
}
return maxsum;
}
int GetGreastestSumOfSubArray2(int a[],int length)
{

if(a==NULL||length<=0)
{
gInvalidInput=true;
return 0;
}
int cursum=0;
int maxsum=0x80000000;
for(int i=0;i<length;i++)
{
if(cursum<=0)
{
cursum=a[i];
}
else
{
cursum+=a[i];
}
if(cursum>maxsum)
{
maxsum=cursum;
}
}
return maxsum;
}
//用动态规划来做。用函数f(i)表示以第i个数字结尾的子数组的最大和。目标函数为max(f(i)) 其中0<=i<n;
//f(i)=a[i]  if(i==0||f(i-1)<=0)
//f(i)=f[i-1]+a[i] if(i!=0&&f(i-1)>0)
int GetGreastestSumOfSubArray3(int a[],int length,int f[],int *lastIndex)//lastIndex 为最大和的最后一个累加数的数组索引
{
if(a==NULL||length<=0)
{
gInvalidInput=true;
return 0;
}
f[0]=a[0];
for(int i=1;i<length;i++)
{
if(f[i-1]>0)
{
f[i]=a[i]+f[i-1];
}
else
{
f[i]=a[i];
}
}
int max=0x80000000,maxIndex=-1;
for(int i=1;i<length;i++)
{
if(max<f[i])
{
max=f[i];
maxIndex=i;
}
}
*lastIndex=maxIndex;
return max;
}
int main()
{
int a[8]={1,-2,3,10,-4,7,2,-5};
int f[8]={0},lastIndex;
cout<<GetGreastestSumOfSubArray(a,8)<<endl;
cout<<GetGreastestSumOfSubArray2(a,8)<<endl;
cout<<GetGreastestSumOfSubArray3(a,8,f,&lastIndex)<<endl;
cout<<a[lastIndex]<<endl;
//<<i<<endl;
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: