《最大连续子序列和》算法实现有很多种,网上的好多例子的代码实现貌似不对,
目前提供一个o(n2)的实现,共大家验证
typescript实现 :
var maxSubSumOn_2 = (array, maxSubLen)=> { let max = 0; let start, end; for (let subStart = 0; subStart < array.length; subStart++) { let sumSub = 0; //初始化最大和0 for (var subIndex = 0; subIndex < maxSubLen; subIndex++) { var realEnd = subStart + subIndex; if (realEnd + 1 > array.length) { realEnd = array.length - 1; } sumSub += array[realEnd]; if (sumSub > max) { start = subStart; end = realEnd; max = sumSub; //更新最大连续子序列和 } } } return {max, start, end} } var a = [1, 1, 1, 1, 1, 6, 5, 4, 3, 2, 1, -1, 4, 1, 1, 1, 1]; var maxSubLen = 8 console.log(maxSubSumOn_2(a, maxSubLen))
java实现
}public class MaxSubUtil { public static void main(String[] args) { int[] a = {1, 1, 1, 1, 1,6, 5, 4, 3, 2, 1,-1, 4, 1, 1, 1, 1}; int len =8; System.out.println("o(n2):"+ maxSubSumOn_2(a, len)); } public static Map<String,Integer> maxSubSumOn_2(int array[], int maxSubLen){ int max=0 ; int start=0,end=0; for (int subStart=0; subStart<array.length; subStart++) { int sumSub = 0; //初始化最大和0 for (int subIndex=0; subIndex<maxSubLen; subIndex++) { int realEnd=subStart+subIndex ; if(realEnd+1>array.length){realEnd=array.length-1;} sumSub += array[realEnd]; if (sumSub > max) { start=subStart; end = realEnd; max = sumSub; //更新最大连续子序列和 } } } Map<String,Integer> res=new HashMap(); res.put("max", max); res.put("start", start); res.put( "end", end); return res; }