这是一道很经典的算法题目,考的烂的不能再烂,还是有很多公司拿它来作为笔试题目,题目不难,这里我给出三种方法。
问题描述:一个整数数组中的元素有正有负,在该数组中找出一个连续子数组,要求该子数组中各元素的和最大,这个子数组便被称作最大子数组。比如数组{2,4,-7,5,2,-1,2,-4,3}的最大子数组为{5,2,-1,2},最大子数组的和为5+2-1+2=8。
方法一:暴力求解方法 利用两个for循环来求解全部所有组合的和,找出其中其中最大的和,代码如下
int find_max_array(const vector<int> &a)
{
int max_sum = 0;
for (int i = 0; i < a.size(); ++i)
{
int this_sum = 0;
for (int j = i; j < a.size(); ++j)
{
this_sum += a[j];
if (this_sum>max_sum)
max_sum = this_sum;
}
}
return max_sum;
}
方法二:通过一遍扫描数组就可以了,记录每次扫描的结果就可以了。