题目描述
题目链接:517. 超级洗衣机
假设有 n 台超级洗衣机放在同一排上。开始的时候,每台洗衣机内可能有一定量的衣服,也可能是空的。
在每一步操作中,你可以选择任意 m (1 <= m <= n) 台洗衣机,与此同时将每台洗衣机的一件衣服送到相邻的一台洗衣机。
给定一个整数数组 machines 代表从左至右每台洗衣机中的衣物数量,请给出能让所有洗衣机中剩下的衣物的数量相等的 最少的操作步数 。如果不能使每台洗衣机中衣物的数量相等,则返回 -1。
思路
遍历每个位置,每个位置的最小操作次数瓶由该位置左右两段的应摊的衣物数量和实际的衣物数量决定,这里分两种情况:
- 左右两段的应摊衣物数量都大于实际的衣物数量,说明需要从当前位置向左右两段移送,由于每次只能操作一件衣物,所以操作次数应为,leftRest + rightRest;
- 不满足第一种条件,说明当前位置既要接收衣物,又要移送衣物,因此操作次数应为max(leftRest, rightRest);
代码描述
class SuperWashingMachines:
"""
超级洗衣机问题
https://leetcode.cn/problems/super-washing-machines/
"""
def solution(self, arr):
"""
:param arr:
:return:
"""
if not arr:
return 0
sum_arr = sum(arr)
n_arr = len(arr)
if sum_arr % n_arr != 0:
return -1
avg = sum_arr/n_arr
left_sum = 0
ans = 0
for i in range(n_arr):
leftRest = left_sum - i * avg
rightRest = (sum_arr - left_sum - arr[i]) - (n_arr-i-1) * avg
if leftRest < 0 and rightRest < 0:
ans = max(ans, abs(leftRest) + abs(rightRest))
else:
ans = max(ans, max(abs(leftRest), abs(rightRest)))
left_sum += arr[i]
return ans