LeetCode 2439. 最小化数组中的最大值 C#
原题链接
中等
作者:
hpstory
,
2022-10-17 22:49:54
,
所有人可见
,
阅读 194
C# 二分代码
public class Solution {
public int MinimizeArrayValue(int[] nums) {
// 二分枚举从0到nums.Max中满足条件的最小值
int left = 0, right = nums.Max();
while (left < right){
// 防止mid溢出
int mid = left + (right - left >> 1);
if (Check(nums, mid)){
right = mid;
}
else {
left = mid + 1;
}
}
return left;
}
private bool Check(int[] nums, int x){
int n = nums.Length;
// 倒序遍历,gap记录上一位可以贡献的超出x的部分
long gap = 0;
for (int i = n - 1; i > 0; i--){
// gap有可能出现负数的情况,需要和0取max
gap = Math.Max(nums[i] - x + gap, 0);
}
return nums[0] + gap <= x;
}
}
C# 贪心 代码
public class Solution {
public int MinimizeArrayValue(int[] nums) {
long result = 0;
long sum = 0;
// 如果第i个数小于前i-1个数的平均值,则最大值仍为前i-1个数的平均值
// 否则最大值为前i个数的平均值上取整
for (int i = 0; i < nums.Length; i++){
sum += nums[i];
result = Math.Max(result, (sum + i) / (i + 1));
}
return (int)result;
}
}