二分法算法總結


例子1:連續數組分組:

題目:例如array = [8, 8, 8, 8], 划分成3個集合,每個集合內的元素必須連續,每個集合內元素總和盡量小,求最大的集合總和。

思路:
輸出是最大步長maxSteps 就是每個划分的集合的最大總和
初始值 maxSteps = max(array), sumSteps = sum(array), maxSteps又稱為當前step的值,而sumSteps是當前step的上限
通過某種方式,一步一步地縮減maxStep的范圍,即削減maxSteps的上限sumSteps,增加maxSteps的下限maxSteps。
極端情況下,最大步長不會超過(maxSteps + sumSteps) >> 1,例如[29, 1], maxSteps = 29, sumSteps = 30, maxStep == 29 + 30 >> 1。
通過這個關系獲取maxSteps的候選值steps:(maxSteps + sumSteps) >> 1
找到當前maxSteps的預估值steps的值與划分的集合數的關系。由於數組划分不改變數組的順序

  • 如果每個集合最大值為steps時,划分的集合數目大於3,說明當前maxSteps的預估值steps的值小了,需要maxSteps = steps + 1
  • 如果每個集合最大值為steps時,划分的集合數目小於3,說明當前maxSteps的預估值steps應該更小,sumStep = steps-1
  • 如果每個集合最大值為steps時,划分的集合數目等於3,說明當前maxSteps的預估值steps可能就是maxSteps的值,sumSteps=steps

  總結:數組分組算法是特殊的二分類算法。

  動態規划和二分法對比:如果可以找到當前結點結果與上一結點結果的關系,用動態規划,如果不能,可以試一試二分法。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM