《LeetCode之每日一题》:163.超级洗衣机
Posted 是七喜呀!
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了《LeetCode之每日一题》:163.超级洗衣机相关的知识,希望对你有一定的参考价值。
题目链接: 超级洗衣机
有关题目
假设有 n 台超级洗衣机放在同一排上。
开始的时候,每台洗衣机内可能有一定量的衣服,也可能是空的。
在每一步操作中,你可以选择任意 m (1 <= m <= n) 台洗衣机,与此同时将每台洗衣机的一件衣服送到相邻的一台洗衣机。
给定一个整数数组 machines 代表从左至右每台洗衣机中的衣物数量,
请给出能让所有洗衣机中剩下的衣物的数量相等的 最少的操作步数 。
如果不能使每台洗衣机中衣物的数量相等,则返回 -1 。
题解
Tips
参考官方题解评论区下排列评论
①理解题干中关键句:
Q1:在每一步操作中,你可以选择任意 m (1 <= m <= n) 台洗衣机,与此同时将每台
洗衣机的一件衣服送到相邻的一台洗衣机。
A1:即首先我们是可以 在一步操作中,注意是 一步操作中,将任意 m 台洗衣机相邻
洗衣机的一件衣服传到相邻的一台洗衣机中。
例子:有洗衣机数组 machine = [ 7, 4, 2, 1],
在一次操作中 我们是可以将7 的一件衣服通过相邻的衣服送给 1 ,使 数组machine = [6, 4, 2, 2]。
Q2:为什么4 0 0 4 需要的操作数是2, 怎么实现的呢
A2:初始4 0 0 4 第一步选第一个和第四个洗衣机 3 1 1 3
第二步选第一个和第四个 2 2 2 2 即每次可以选的洗衣机个数不止一个
Q2:为什么【0,0,11,5】的输入为什么不是7步,而是8步?
A3:
第1步:0 0 <-- 11 5,变成0 1 10 5
第2步:0 <-- 1 <-- 10 5,变成1 1 9 5
第3步:1 <-- 1 <-- 9 5,变成2 1 8 5
第4步:2 <-- 1 <-- 8 5,变成3 1 7 5
第5步:3 <-- 1 <-- 7 5,变成4 1 6 5
第6步:4 1 <-- 6 5,变成4 2 5 5
第7步:4 2 <-- 5 5,变成4 3 4 5
第8步:4 3 <-- 4 <-- 5,变成4 4 4 4
法一:贪心
参考官方题解
class Solution {
public:
int findMinMoves(vector<int>& machines) {
int n = machines.size();
//先判断洗衣机是否能够使 每台洗衣机中衣物的数量相等
int tot = accumulate(machines.begin(), machines.end(), 0);
if (tot % n != 0) return -1;
int ans = 0;
int avg = tot / n, sum = 0;
for (auto num : machines){
num -= avg;
sum += num;
ans = max(ans, max(abs(sum), num));
}
return ans;
}
};
以上是关于《LeetCode之每日一题》:163.超级洗衣机的主要内容,如果未能解决你的问题,请参考以下文章
解题报告Leecode 372. 超级次方——Leecode每日一题系列