2021-04-07:給定一個非負數組arr,長度爲N,那麼有N-1種方案能夠把arr切成左右兩部分

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
    }
}

執行結果以下:
在這裏插入圖片描述數組


左神java代碼
評論ide

相關文章
相關標籤/搜索