面试题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);
思路:最笨最直接的做法枚举数组的所有子数组并求出它们的和。长度为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; }
相关文章推荐
- 黑马程序员——java基础——管道流
- 设计模式面试
- 黑马程序员_集合框架(一)
- 面试题30 最小的K个数
- 一道SQL面试例题 if...else 与聚集函数
- 黑马程序员--应用:类的创建练习
- 黑马程序员--手机类的例子
- C# SQL 面试题自我总结
- 面试题29数组中出现次数超过一半的数字
- 程序员面试笔试宝典——读书笔记1、程序设计基础知识
- 黑马程序员——java基础 集合 (复习)
- 程序员为何对苹果 Mac 情有独钟?
- 给程序员推荐一些提高工作效率的工具
- 【原创分享】动态新增行和删除行
- Java面试--io
- 杭州地区IT公司招聘分析与求职建议
- 程序员为何对苹果 Mac 情有独钟?
- 读程序员的自我修养应该弄懂的问题
- php代码优化,mysql语句优化,面试需要用到的
- 黑马程序员—————Java基础--------IO流