要達到時間復雜度為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的值。相較而言,貪心算法的空間復雜度更低,也更優。