2021-04-17:給定一個整型數組 arr,數組中的每一個值都爲正數,表示完成一幅畫做須要的時間,再 給定 一個整數 num,表示畫匠的數量,每一個畫匠只能畫連在一塊兒的畫做。全部的畫家 並行工做,請

2021-04-17:給定一個整型數組 arr,數組中的每一個值都爲正數,表示完成一幅畫做須要的時間,再 給定 一個整數 num,表示畫匠的數量,每一個畫匠只能畫連在一塊兒的畫做。全部的畫家 並行工做,請 返回完成全部的畫做須要的最少時間。【舉例】arr=[3,1,4],num=2。最好的分配方式爲第一個畫匠畫 3 和 1,所需時間爲 4。第二個畫匠畫 4,所需時間 爲 4。 由於並行工做,因此最少時間爲 4。若是分配方式爲第一個畫匠畫 3,所需時 間爲 3。第二個畫 匠畫 1 和 4,所需的時間爲 5。那麼最少時間爲 5,顯然沒有第一 種分配方式好。因此返回 4。arr=[1,1,1,4,3],num=3。最好的分配方式爲第一個畫匠畫前三個 1,所需時間爲 3。第二個畫匠畫 4,所需時間 爲 4。 第三個畫匠畫 3,所需時間爲 3。返回 4。java

福大大 答案2021-04-17:git

二分法。github

代碼用golang編寫。代碼以下:golang

package main

import (
    "fmt"
    "math"
)

func main() { 
    arr := []int{ 2, 6, 3, 5}
    M := 2
    ret := splitArray3(arr, M)
    fmt.Println(ret)
}
func splitArray3(nums []int, M int) int { 
    sum := int64(0)
    for i := 0; i < len(nums); i++ { 
        sum += int64(nums[i])
    }
    l := int64(0)
    r := int64(sum)
    ans := int64(0)
    for l <= r { 
        mid := int64((l + r) / 2)
        cur := getNeedParts(nums, mid)
        if cur <= M { 
            ans = mid
            r = mid - 1
        } else { 
            l = mid + 1
        }
    }
    return int(ans)
}
func getNeedParts(arr []int, aim int64) int { 
    for i := 0; i < len(arr); i++ { 
        if int64(arr[i]) > aim { 
            return math.MaxInt32
        }
    }
    parts := 1
    all := arr[0]
    for i := 1; i < len(arr); i++ { 
        if int64(all+arr[i]) > aim { 
            parts++
            all = arr[i]
        } else { 
            all += arr[i]
        }
    }
    return parts
}

執行結果以下:
圖片數組


左神java代碼
力扣410. 分割數組的最大值url