您的位置:首页 > 编程语言 > Go语言

Leetcode:Maximum Subarray

2017-09-09 16:11 204 查看

Question:

Find the contiguous subarray within an array (containing at least one number) which has the largest sum.
For example, given the array [-2,1,-3,4,-1,2,1,-5,4],the contiguous subarray [4,-1,2,1] has the largest sum = 6.


最大子数组和问题

虽然在LeetCode上显示的难度是easy,但事实上本题并不简单,即找到一个连续的子数组并且满足该数组的所有数之和是数组所有子数组中最大的,函数返回该最大值。

解法:

首先我们要先注意的是
contiguous
,指的是连续的序列,对于一个素数为n的数组,其含有2n个子序列和n(n+1)/2个连续的子序列。因此最容易想到的方法就是穷举法,但至少要O(n2)的时间复杂度,显然不是一个好的算法。

先进行分析,若数组中所有数为负数时,最大值应该为一个最大的负数;其他情况的最大值必然是一个正数,因此若当和小于0时,必然要重新组合成下一个子序列。另外还要注意的是vector的函数用法。

算法描述:

(1)遍历该数组, 在遍历过程中, 将遍历到的元素依次累加起来, 当累加结果小于0时, 从下一个元素开始,重新开始累加。

(2)累加过程中, 要用一个变量max记录所获得过的最大值

(3)一次遍历之后, 变量 max中存储的即为最大子片段的和值

代码如下

class Solution {
public:
int maxSubArray(vector<int>& nums) {
int sum = 0;
int max = 0x80000001;//将max设为最小值
int n = 0;
while(n < nums.size()) {
sum += nums
;
if (max < sum) max = sum;
if (sum < 0) sum = 0;
n++;
}
return max;
}
};


总结与其他算法

查阅资料后发现该题涉及一个算法思想Kadane算法

该问题最初由布朗大学的Ulf Grenander教授于1977年提出,当初他为了展示数字图像中一个简单的最大似然估计模型。不久之后卡内基梅隆大学的Jay Kadane提出了该问题的线性算法:Kadane算法扫描一次整个数列的所有数值,在每一个扫描点计算以该点数值为结束点的子数列的最大和(正数和)。该子数列由两部分组成:以前一个位置为结束点的最大子数列、该位置的数值。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  Algorithms