2021-08-19:超级洗衣机。假设有 n 台超级洗衣机放在同一排上。开始的时候,每台洗衣机内可能有一定量的衣服,也可能是空的。在每一步操作中,你可以选择任意 m (1 ≤ m ≤ n) 台洗衣机,
2021-08-19:超級(jí)洗衣機(jī)。假設(shè)有 n 臺(tái)超級(jí)洗衣機(jī)放在同一排上。開(kāi)始的時(shí)候,每臺(tái)洗衣機(jī)內(nèi)可能有一定量的衣服,也可能是空的。在每一步操作中,你可以選擇任意 m (1 ≤ m ≤ n) 臺(tái)洗衣機(jī),與此同時(shí)將每臺(tái)洗衣機(jī)的一件衣服送到相鄰的一臺(tái)洗衣機(jī)。給定一個(gè)非負(fù)整數(shù)數(shù)組代表從左至右每臺(tái)洗衣機(jī)中的衣物數(shù)量,請(qǐng)給出能讓所有洗衣機(jī)中剩下的衣物的數(shù)量相等的最少的操作步數(shù)。如果不能使每臺(tái)洗衣機(jī)中衣物的數(shù)量相等,則返回 -1。
福大大 答案2021-08-19:
這道題是見(jiàn)過(guò)就會(huì),沒(méi)見(jiàn)過(guò)就不會(huì)。
首先看能否平均分配。如果不能平均分配,就不進(jìn)行下一步了;如果能平均分配,就下一步。
情況一,+a、i、-b,a正和b正取最大值。
情況二,+a、i、+b,a正和b正取最大值。
情況三,-a、i、-b,a正+b正。
情況四,-a、i、+b,a正和b正取最大值。
遍歷數(shù)組,取最大值就是需要的返回值。
代碼里第2種方法,數(shù)組的每個(gè)元素減去了平均值,方便計(jì)算。
時(shí)間復(fù)雜度:O(N)。
額外空間復(fù)雜度:O(1)。
代碼用golang編寫。代碼如下:
package mainimport "fmt"func main() {arr := []int{1, 2, 3, 4, 5}ret := findMinMoves1(arr)fmt.Println(ret)ret = findMinMoves2(arr)fmt.Println(ret) }func findMinMoves1(arr []int) int {if len(arr) == 0 {return 0}size := len(arr)sum := 0for i := 0; i < size; i++ {sum += arr[i]}if sum%size != 0 {return -1}avg := sum / sizeleftSum := 0ans := 0for i := 0; i < len(arr); i++ {leftRest := leftSum - i*avgrightRest := (sum - leftSum - arr[i]) - (size-i-1)*avgif leftRest < 0 && rightRest < 0 {ans = getMax(ans, Abs(leftRest)+Abs(rightRest))} else {ans = getMax(ans, getMax(Abs(leftRest), Abs(rightRest)))}leftSum += arr[i]}return ans }func findMinMoves2(arr []int) int {if len(arr) == 0 {return 0}size := len(arr)sum := 0for i := 0; i < size; i++ {sum += arr[i]}if sum%size != 0 {return -1}avg := sum / sizesum = 0//數(shù)組每個(gè)元素全部減去平均值for i := 0; i < size; i++ {arr[i] -= avgsum += arr[i]}leftSum := 0ans := 0for i := 0; i < len(arr); i++ {leftRest := leftSumrightRest := sum - leftSum - arr[i]if leftRest < 0 && rightRest < 0 {ans = getMax(ans, Abs(leftRest)+Abs(rightRest))} else {ans = getMax(ans, getMax(Abs(leftRest), Abs(rightRest)))}leftSum += arr[i]}//數(shù)組恢復(fù)for i := 0; i < size; i++ {arr[i] += avg}return ans }func Abs(a int) int {if a < 0 {return -a} else {return a} }func getMax(a int, b int) int {if a > b {return a} else {return b} }執(zhí)行結(jié)果如下:
左神java代碼
總結(jié)
以上是生活随笔為你收集整理的2021-08-19:超级洗衣机。假设有 n 台超级洗衣机放在同一排上。开始的时候,每台洗衣机内可能有一定量的衣服,也可能是空的。在每一步操作中,你可以选择任意 m (1 ≤ m ≤ n) 台洗衣机,的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 个人能力--沟通
- 下一篇: 计算机考研和新闻学考研科目,新闻学考研: