2021-08-19:超级洗衣机。假设有 n 台超级洗衣机放在同一排上。开始的时候,每台洗衣机内可能有一定量的衣服,也可能是空的。在每一步操作中,你可以选择任意 m (1 ≤ m ≤ n) 台洗衣机,
生活随笔
收集整理的這篇文章主要介紹了
2021-08-19:超级洗衣机。假设有 n 台超级洗衣机放在同一排上。开始的时候,每台洗衣机内可能有一定量的衣服,也可能是空的。在每一步操作中,你可以选择任意 m (1 ≤ m ≤ n) 台洗衣机,
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
2021-08-19:超級洗衣機。假設有 n 臺超級洗衣機放在同一排上。開始的時候,每臺洗衣機內可能有一定量的衣服,也可能是空的。在每一步操作中,你可以選擇任意 m (1 ≤ m ≤ n) 臺洗衣機,與此同時將每臺洗衣機的一件衣服送到相鄰的一臺洗衣機。給定一個非負整數數組代表從左至右每臺洗衣機中的衣物數量,請給出能讓所有洗衣機中剩下的衣物的數量相等的最少的操作步數。如果不能使每臺洗衣機中衣物的數量相等,則返回 -1。
福大大 答案2021-08-19:
這道題是見過就會,沒見過就不會。
首先看能否平均分配。如果不能平均分配,就不進行下一步了;如果能平均分配,就下一步。
情況一,+a、i、-b,a正和b正取最大值。
情況二,+a、i、+b,a正和b正取最大值。
情況三,-a、i、-b,a正+b正。
情況四,-a、i、+b,a正和b正取最大值。
遍歷數組,取最大值就是需要的返回值。
代碼里第2種方法,數組的每個元素減去了平均值,方便計算。
時間復雜度:O(N)。
額外空間復雜度: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//數組每個元素全部減去平均值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]}//數組恢復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} }執行結果如下:
左神java代碼
總結
以上是生活随笔為你收集整理的2021-08-19:超级洗衣机。假设有 n 台超级洗衣机放在同一排上。开始的时候,每台洗衣机内可能有一定量的衣服,也可能是空的。在每一步操作中,你可以选择任意 m (1 ≤ m ≤ n) 台洗衣机,的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 个人能力--沟通
- 下一篇: 计算机考研和新闻学考研科目,新闻学考研: