问题描述:
给定一个由数字组成的数组,求出和最大的子数组
求解方法:
1.暴力法
选取所有连续和的可能性,O(n^2)
2.分析法
当遍历到第i个元素时,判断在它前面的连续子序列和是否大于0,如果大于0,则以位置i结尾的最大连续子序列和为元素i和前门的连续子序列和相加;否则,则以位置i结尾的最大连续子序列和为元素i。
3.动态规划
记s[i]是以a[i]结尾的最大子数组和
s[i+1]=max(s[i]+a[i+1],a[i+1])
s[0]=a[0];
遍历数组a[i]即可得到以每一项结尾的最大子数组和s[i],求出其中最大值
package offer_0831;
import java.util.Collections;
import java.util.LinkedList;
import java.util.List;
public class MaxSerialSubList {
// 暴力法 - func1 - 略
// 分析法
Integer func2(List<Integer> nums) {
int maxRes = 0;
int resBefore = 0;
for (Integer i : nums) {
if (resBefore < 0) {
resBefore = i;
} else {
resBefore = i + resBefore;
maxRes = maxRes > resBefore ? maxRes : resBefore;
}
}
return maxRes;
}
// 动态规划
Integer func3(List<Integer> nums) {
List<Integer> res = new LinkedList<Integer>();
res.add(nums.get(0));
for(int i = 1;i< nums.size();i++){
res.set(i,res.get(i-1)+nums.get(i)>0?res.get(i-1)+nums.get(i):nums.get(i));
}
return Collections.max(res);
}
}