例子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
總結:數組分組算法是特殊的二分類算法。
動態規划和二分法對比:如果可以找到當前結點結果與上一結點結果的關系,用動態規划,如果不能,可以試一試二分法。