簡體   English   中英

在二維數組的一行中查找所需的總和java

[英]Finding the desired sum in a row of a 2d array java

我無法圍繞如何實現一個方法開始到總和。 例如,如果輸入數組是

int[][] input = new int[][]{
{3,4,4,2,7},
{2,3,2,8,6},
{1,4,2,1,2}
}

當總和設置為 7 時,它將產生一個具有以下值的輸出數組

{3,4,0,0,7},
{2,3,2,0,0},
{1,4,2,1,0}
}

輸出數組應該只顯示與它們的鄰居相加等於一組數字 (7) 的值,或者如果它是 0-9 值之間的數字是所需的總和(當您搜索 7 時,它會顯示所有 7)。 為了進一步澄清,正如您在輸出數組中看到的那樣,它顯示前兩個值 3 和 4,因為它們與 7 相加。它顯示 2,3,2,因為它們與 7 相加。它打印出 1,4 ,2,1 在底部,因為 1,4,2 加到 7 和 4,2,1 加到 7。總而言之,它只顯示 7 或加起來為 7 的值,旁邊是數字,否則顯示 0。而且輸入值必須 <0。

經過一段時間的頭腦風暴,我知道代碼將需要許多嵌套循環:一個循環遍歷行,在那個循環中循環遍歷列,在那個循環中更新總和,當總和等於預設時停止sum(在這種情況下為 7),最后是一個循環來更新輸出 [][]。 但是,我在編寫正確實現所有這些循環的代碼時遇到了很多麻煩。 我打算對垂直相加的數字做同樣的事情,但現在想專注於水平。

您需要三個嵌套循環。 或者真的,三層嵌套循環,最內層有兩個循環,但我最后會回到那個。

在任何循環之前,創建結果數組的主干。 如果此時它是對數組的空引用的數組,那也沒關系。

外循環:循環遍歷外數組。 經典的for循環是一種選擇。 對於每個條目,在結果中創建一個長度正確的內部數組,開始時填充零。

中間循環,循環遍歷內部數組中的條目。 同樣,經典的for循環很好。 您的目標是每次迭代將確定一系列總和為 7 的相鄰值是否從該條目開始,如果是,找出它的長度,並將有問題的條目復制到結果數組中。

內循環(即第一個內循環)用於添加相鄰條目以找出總和是否為 7。您從中間循環的條目開始並將值相加。 這個循環有一個雙重停止條件:當總和為 7 或更大時停止(假設所有值都是正的),但很明顯,當到達內部數組的末尾時也會停止。 while循環符合我的口味。 僅當總和恰好達到 7 時,才使用新的內部循環將值復制到結果中。

PS 如果你假設所有的值都是正的,你不應該只是假設,你應該檢查。 在中間循環中,如果該條目中的值為 0 或負數,則拋出IllegalArgumentException

這可以以 O(NxM) 的復雜度完成。

對於每一行,您保留兩個索引(例如,iLow 和 iHigh 初始化為第一個項目輸入 [i][0])和一個 sumSoFar 變量。 在每次迭代中,如果 sumSoFar < 7,則增加 iHigh。 如果它 > 7,則增加 iLow 和 iHigh。 如果它是 == 7,那么您已經找到了一種組合 + 增量 iLow 和 iHigh。

這應該給出算法的高級概念,我確信很多細節都缺失/不完整,但您應該能夠將其放入代碼中。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM