问题
解决方案
1.贪心算法
思路
维护一个当前序列和变量,如果这个变量小于零,就丢弃这个变量,重新初始化为零,重新从当前索引计算序列和。每次计算之后都要与最大值进行比较。
算法步骤
- 参数初始化
- 当前序列和 : 初始化为零
- 最大序列和 : 初始化为最小整数(Integer.MIN_VALUE)
- 遍历数组
- 判断当前序列和是否需要重置
- 序列和与当前索引处元素值相加
- 判断当前序列和与最大值的大小关系
- 返回最大值
完整代码
public int maxSubArray(int[] nums){
int cur_sum = 0;
int max_sum = Integer.MIN_VALUE;
for(int i=0;i<nums.length;i++){
if(cur_sum < 0)
cur_sum = 0;
cur_sum+=nums[i];
if(max_sum < cur_sum)
max_sum = cur_sum;
}
return max_sum;
}
2.动态规划
思路
要得到最大序列和,可以求出以每个元素为终点的最大序列和,然后取最大值。计算以当前元素为终点的序列和,只用判断上一个元素的最大序列和是否大于零,如果大于,就加在当前元素上,组成当前元素的最大序列和,如果小于或等于,则当前元素值就为最大序列和。
算法步骤
-参数初始化
序列和最大值:初始化为最小的整数(Integer.MIN_VALUE)
- 迭代 <