2021-04-07:給定一個非負數組arr,長度爲N,那麼有N-1種方案能夠把arr切成左右兩部分,每一種方案都有,min{左部分累加和,右部分累加和},求這麼多方案中,min{左部分累加和,右部分累加和}的最大值是多少? 整個過程要求時間複雜度O(N)。java
福大大 答案2021-04-07:git
天然智慧便可。
1.算出總累加和。
2.依次遍歷,算出左累加和、右累加和。假設最小值是min。
3.當min大於ans時,保存min到ans中。
4.當左累加和大於右累加和時,退出循環。
5.返回ans。github
代碼用golang編寫。代碼以下:golang
package main import "fmt" func main() { arr := []int{1, 2, 3, 0, 0, 100, 1, 1} ret := bestSplit(arr) fmt.Println(ret) } func bestSplit(arr []int) int { if len(arr) < 2 { return 0 } N := len(arr) sumAll := 0 for i := 0; i < N; i++ { sumAll += arr[i] } ans := 0 sumL := 0 // [0...s] [s+1...N-1] for s := 0; s < N-1; s++ { sumL += arr[s] sumR := sumAll - sumL ans = getMax(ans, getMin(sumL, sumR)) if sumL > sumR { break } } return ans } func getMax(a int, b int) int { if a > b { return a } else { return b } } func getMin(a int, b int) int { if a < b { return a } else { return b } }
執行結果以下:
數組