躬行算法之最小的最大值

Java74

最近看到这样一道面试题, 求最小的最大值,觉得挺有意思,在这里分享下。

给定一个数组 a,包含 n 个整数。再给定一个整数 k,可以给数据中任意整数加 1,总共可以加 k 次。加完 k 次之后,找出数组中的最大数,要求得到最小的最大数。

乍一看,我甚至不明白这个标题。最大值和最小值是多少?这个问题最重要的是理解主题的含义。

[En]

At first glance, I didn't even understand the title. What, the maximum and the smallest? The most important thing in this question is to understand the meaning of the topic.

有一种理解,我认为非常贴近生活,就是把数组 a 理解为若干个垃圾桶,这些垃圾桶中有数量不等的垃圾,而此时我们手里有 k 袋垃圾,可以任意投放。放在这个题目中,就是要找到合理的投放方式使得垃圾桶尽可能不要堆得太高,然后找到最满的桶中的垃圾数量。

这样一考虑,题目就变得非常简单了。

回到题目,首先计算出数组 a 中最大数为 max,尝试把所有小于 max 的数填平。若 k 值太小,无法填平,则最小的最大数即为 max;若 k 值够大,填平之后 k 还有剩余,则依次平铺,每一轮每个元素都加 1,直到 k 归零为止。

根据以上分析,很容易写出以下答案:

```java
private int findMinMaxValue(int[] array, int k) {
int n = array.length, max = 0, sum = 0;
for (int x : array) {
max = Math.max(x, max);
sum += x;

输入验证码查看隐藏内容

扫描二维码关注本站微信公众号 Johngo学长
或者在微信里搜索 Johngo学长
回复 svip 获取验证码
wechat Johngo学长