2016-02-13 54 views
0

我正在嘗試編寫從給定數組的連續子數組中給出最大總和的scala代碼。例如,val arr= Array(-2, -3, 4, -1, -2, 1, 5, -3)。在這個數組中,我需要得到最大的連續的子數組總和,即4 +( - 1)+( - 2)+(1)+5 = 7.我寫下面的代碼來獲得這個結果。是否有可能根據條件更新foldLeft函數中的變量?

scala> arr.foldLeft(0) { (currsum,newnum) => if((currsum+newnum)<0) 0 else { if(currsum<(currsum+newnum)) (currsum+newnum) else currsum }} 
res5: Int = 10 

但是從實際結果偏離,因爲我無法爲計數/求和繼續更新maximum_so_far值。由於我使用foldLeft來執行此功能,只有當連續的子數組元素的和大於先前的max_sum時,纔有可能更新maximum_so_far變量?

reference link for better understanding of scenario

+0

你是什麼意思的「連續的子陣列」? – Jubobs

+1

@Jubobs,它意味着最大。 sum應包含來自子數組/數組的連續元素。這意味着來自給定陣列的4 +( - 1)+( - 2)+(1)+5 = 7的總和,但不是4 + 1 + 5 = 10的總和。爲了更好地理解場景,請查看以上問題底部提供的鏈接。感謝 – Mahesh

+2

您的代碼沒有'maximum_so_far'值,因此您不清楚您的意思。但是通常在foldLeft中,你不會「更新」一個變量,而是將累加器中的新值傳遞給下一次迭代。因此,不要只傳遞'currsum'來傳遞一對'(currsum,maxsofar)'並根據需要提取這些值。 –

回答

1

顯然,你必須傳播沿着你的輸入數據的兩個值這個計算,就像你需要在必要的情況下,要做到:

arr.foldLeft((0,0)){ 
    case ((maxSum, curSum), value) => { 
    val newSum = Math.max(0, curSum + value) 
    (Math.max(maxSum, newSum), newSum) 
    } 
}._1 

的另一個方法是先以計算中間結果(如果你想要的話懶惰),然後選擇最大值:

arr.toIterator.scanLeft(0){ 
    case (curSum, value) => 
    Math.max(0, curSum + value) 
}.max 
+0

這將是非常有益的。謝謝 – Mahesh

相關問題