求数组的最大连续子数组和
要达到时间复杂度为n,可以采用贪心算法和动态规划。
贪心算法:
function max(arr){ let max = arr[0],cur = 0; for(let i = 0; i < arr.length; i++){ if(cur < 0){ // 当cur < 0时,那么只要加上一个负数都会使得下一个数变小,所以可以直接弃掉,从当前i开始重新积累 cur = arr[i]; }else{ cur += arr[i]; } if(cur >= max){ max = cur; } } return max; }
动态规划:
1 function max_2(arr){ 2 let max = [],result = 0; 3 max[0] = 0; 4 for(let i = 0; i < arr.length; i++){ 5 if(max[i] < 0){ 6 max[i+1] = arr[i]; 7 }else{ 8 max[i+1] = max[i] + arr[i]; 9 } 10 if(max[i+1] > result){ 11 result = max[i+1]; 12 } 13 } 14 return result; 15 }
其实这到题的动态规划的思路和贪心很像,max[i + 1]存放的就是每一次走到 i 时,cur的值。相较而言,贪心算法的空间复杂度更低,也更优。