▶ 超级洗碗机。给定一个有 n 元素的整数数组,我们把 “将指定位置上元素的值减 1,同时其左侧或者右侧相邻元素的值加 1” 称为一次操作,每个回合内,可以选定任意 1 至 n 个位置进行独立的操作,求最少的回合数,使得该数组中的搜有元素调整为相等的值。若不存在(所有元素的和不能被元素个数整除),返回 -1 。

● 代码,14 ms,最大差距法。考虑将所有元素的平均值平移到 0,记此时 machines[ 0 ] == a,如果 a == 0,则 machines[ 0 ]已经调整完成,跳过;若 a > 0,则考虑对 machines[ 0 ] 做 a 次操作将多余部分转移到 machines[ 1 ] 上;若 a < 0,则考虑对 machines[ 1 ] 做 a 次操作,补充 machines[ 0 ] 缺少的部分。然后对 machines[1] 做相同的分析,以此类推向后处理。发现在这一过程中,所需的最大回合数实际上取决于两个数:①某个元素本身的绝对值大小(如所有元素都是0,只有一个元素为 10000,则回合数取决于该值);②从 machines[ 0 ] 开始积累到该元素为止的(比如前三个元素为分别为 1,2,3,则分析 machines[3] 时前面已经积累了 6 个单位,至少需要 6 回合才能消灭这个峰)。

 class Solution
{
public:
int findMinMoves(vector<int>& machines)
{
const int n = machines.size();
int i, total, average, count, maxnum;
for (i = total = ; i < n; total += machines[i++]);
if (total % n)
return -;
for (average = total / n, i = count = maxnum = ; i < n; i++)
{
count += machines[i] - average;// 计算当前格点和平均值的差距
maxnum = max(max(maxnum, abs(count)), machines[i] - average);// 比较历史maxnum,累计差距,当前差距中最大者
}
return maxnum;
}
};

● 逐格分析,14 ms

■ 先计算数组 machiunes 的累积和 sum,可以用其最后一个元素来计算平均值以及判断是否有解

■ 对于第 i 个格点,计算其左侧编号为 0 ~ i-1 的 i 个格点的 数值需求量(i * avg) - 数值保有量(sum[i]),记作 lp

■ 其右侧编号为 i+1 ~ machines.size()-1 的 n-1-i 个格点类似处理,结果记作 rp

■ 若 lp > 0 && rp > 0,说明两边都缺货,应该从第 i 格点往两边分配,需要 abs(lp) + abs(rp) 回合

■ 若 lp < 0 && rp < 0,说明两边都有富余,应该从两边向第 i 格点分配,需要 max(abs(lp), abs(rp)) 回合

■ 若 lp < 0 && rp > 0 || lp > 0 && rp < 0,说明两侧不均等,需要借助第 i 格点进行传递,需要 max(abs(L), abs(rp)) 回合

 class Solution
{
public:
int findMinMoves(vector<int>& machines)
{
const int len = machines.size();
int i, avg, res, lp, rp;
vector<int> sum(len + , );
for (i = ; i < len; i++)// 累积和
sum[i + ] = sum[i] + machines[i];
if (sum[len] % len)
return -;
for (avg = sum[len] / len, i = res = ; i < len; i++)
{
lp = i * avg - sum[i];
rp = (len - i - ) * avg - (sum[len] - sum[i] - machines[i]);
if (lp > && rp > )
res = max(res, abs(lp) + abs(rp));
else
res = max(res, max(abs(lp), abs(rp)));
}
return res;
}
};

517. Super Washing Machines的更多相关文章

  1. Leetcode - 517 Super Washing Machines

    今天开始定期记录本人在leetcode上刷题时遇到的有意思的题目.   517. Super Washing Machines   You have n super washing machines ...

  2. 517 Super Washing Machines 超级洗衣机

    详见:https://leetcode.com/problems/super-washing-machines/description/ C++: class Solution { public: i ...

  3. 第十五周 Leetcode 517. Super Washing Machines(HARD) 贪心

    Leetcode517 很有趣的一道题 由于每一步可以任选某些数字对它们进行转移,所以实际上是在求最优解中的最复杂转移数. 那么我们考虑,到底哪一个位置要经过的流量最大呢? 枚举每个位置,考虑它左边的 ...

  4. [LeetCode] Super Washing Machines 超级洗衣机

    You have n super washing machines on a line. Initially, each washing machine has some dresses or is ...

  5. [Swift]LeetCode517. 超级洗衣机 | Super Washing Machines

    You have n super washing machines on a line. Initially, each washing machine has some dresses or is ...

  6. LeetCode517. Super Washing Machines

    You have n super washing machines on a line. Initially, each washing machine has some dresses or is ...

  7. LeetCode All in One题解汇总(持续更新中...)

    突然很想刷刷题,LeetCode是一个不错的选择,忽略了输入输出,更好的突出了算法,省去了不少时间. dalao们发现了任何错误,或是代码无法通过,或是有更好的解法,或是有任何疑问和建议的话,可以在对 ...

  8. LeetCode Weekly Contest 20

    1. 520. Detect Capital 题目描述的很清楚,直接写,注意:字符串长度为1的时候,大写和小写都是满足要求的,剩下的情况单独判断.还有:我感觉自己写的代码很丑,判断条件比较多,需要改进 ...

  9. All LeetCode Questions List 题目汇总

    All LeetCode Questions List(Part of Answers, still updating) 题目汇总及部分答案(持续更新中) Leetcode problems clas ...

随机推荐

  1. JAVA异常处理分析(中)

    在使用java异常处理机制时候我们会发现有些异常抛出后可以不需要进行抓取处理,而有些异常必须要进行抓取处理,这是个什么情况呢? 设计理念猜想:      有一些场景的异常,是可以不需要处理或是经常不会 ...

  2. 基于Oracle的SQL优化(崔华著)-学习笔记

    201704171025 01. 列rows记录的就是执行计划中每一个执行步骤所对应的Cardinality的值 列Cost(%CPU)记录的就是执行计划中的每一个执行步骤对应的成本 02. Comp ...

  3. 本地绑定域名及host做快速解析与域名屏蔽处理

    在电脑中成功安装好IIS后,打开C:\WINDOWS\system32\drivers\etc\用记事本打开hosts文件,把127.0.0.1   localhost复制,粘贴到最后,然后把loca ...

  4. JS使用及技巧.

    JS小技巧 1.如果你JS了解的还不深请看 汤姆大叔的博客 ,肯定让你上升一个台阶. 2.百科全书 MDN. 3.两个非常简单实用的提示插件 toastr sweetalert. 4.数据类型的复制: ...

  5. 20181009-6 选题 Scrum立会报告+燃尽图 05

    Scrum立会报告+燃尽图(05)选题 此作业要求参见:https://edu.cnblogs.com/campus/nenu/2018fall/homework/2195 一.小组介绍 组长:刘莹莹 ...

  6. redis-cluster集群安装(基于redis-3.2.10)

    上节主要演示了redis单节点的安装部署,对于数据量更大的服务可以安装redis-cluster进行处理 1. 安装ruby yum install ruby ruby-devel rubygems ...

  7. maven安装之后,或者升级之后遇到的问题:could not find or load main class org.codehaus.plexus.class.....

    从maven2升级到maven3或者从maven3降级到maven2,M2_HOME环境变量改变后,在终端执行mvn -v,出现如下错误: Exception in thread "main ...

  8. iOS NSLog去掉时间戳及其他输出样式

    1.一般项目中我的NSLog会在Prefix.pch文件添加如下代码,已保证在非调试状态下NSLog不工作   1 2 3 4 5 #ifdef DEBUG #define NSLog(...) NS ...

  9. 使用LINQ获取List列表中的某个字段值

    使用LINQ获取列表中的某个字段值,下面以获取员工列表中的编号字段为例子. 1.使用Select方法 List<Emplayee> emplayeeList = GetEmplayeeLi ...

  10. Java进行数据库导出导入 亲测可用

    /** * @param hostIP ip地址,可以是本机也可以是远程 * @param userName 数据库的用户名 * @param password 数据库的密码 * @param sav ...