面试题2:求子数组的最大和
2011-06-23 17:46
423 查看
题目:
输入一个整形数组,数组里有正数也有负数。
数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和。
求所有子数组的和的最大值。要求时间复杂度为O(n)。
分析:
动态规划。求maxsum(n),maxsum(n)是前n个元素中包含第n个元素的子数组最大和。递归公式:
if maxsum(n-1)>0,则maxsum(n)=maxsum(n-1)+element(n);否则,maxsum(n)=element(n)。
输入一个整形数组,数组里有正数也有负数。
数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和。
求所有子数组的和的最大值。要求时间复杂度为O(n)。
分析:
动态规划。求maxsum(n),maxsum(n)是前n个元素中包含第n个元素的子数组最大和。递归公式:
if maxsum(n-1)>0,则maxsum(n)=maxsum(n-1)+element(n);否则,maxsum(n)=element(n)。
#include <iostream> const int mininum=-100000; using namespace std; void maxsum(int * element,int size){ int max=mininum; int max_index=0; int * index=new int [size];//保存子数组的开始位置 int * max_sum=new int [size];//保存最大和 index[0]=0; max_sum[0]=element[0]; for(int i=1;i<size;i++){ if(max_sum[i-1]>0){ max_sum[i]=max_sum[i-1]+element[i]; index[i]=index[i-1]; } else{ max_sum[i]=element[i]; index[i]=i; } if(max_sum[i]>max){ max=max_sum[i]; max_index=i; } } cout<<"The max subarray is:"<<endl; for(int i=index[max_index];i<=max_index;i++){ cout<<element[i]<<' '; } cout<<endl<<"The sum is:"<<max<<endl; delete [] index; delete [] max_sum; } int main(){ cout<<"Please input the number of the element:"<<endl; int size; cin>>size; int * element=new int[size]; for(int i=0;i<size;i++){ cin>>element[i]; } maxsum(element,size); return 0; }
相关文章推荐
- 程序员面试题精选(03)-求子数组的最大和
- 程序员面试题精选100题(03)-求子数组的最大和
- 一道很火的面试题:求子数组的最大和
- 求子数组的最大和问题--一道浙江大学考研压轴题(被Google拿来做面试题)
- 面试题 31: 求子数组的最大和
- 面试题05:求子数组的最大和
- 面试题五:求子数组的最大和
- 微软面试题---求子数组最大乘积问题
- 【面试题经典重温【原创】】求子数组的最大和
- 微软面试题解题笔记——求子数组的最大和
- 3 微软面试题:求子数组的最大和,并找出此子数组
- 算法与数据结构面试题(3)-求子数组的最大和
- 程序员面试题精选100题(03)-求子数组的最大和
- 程序员面试题精选100题(03)-求子数组的最大和
- 微软面试题系列(三):求子数组的最大和
- 程序员面试题100题第03题——求子数组的最大和
- 求子数组的最大和【DP】
- 面试题:给出一数组,求这数组中出现最多次数的值且最大
- 面试题系列-整数数组长度为n,分为m份使各份的和相等,求最大的m
- 求子数组的最大和