最大化城市的最小电量
难度:
标签:
题目描述
You are given a 0-indexed integer array stations
of length n
, where stations[i]
represents the number of power stations in the ith
city.
Each power station can provide power to every city in a fixed range. In other words, if the range is denoted by r
, then a power station at city i
can provide power to all cities j
such that |i - j| <= r
and 0 <= i, j <= n - 1
.
- Note that
|x|
denotes absolute value. For example,|7 - 5| = 2
and|3 - 10| = 7
.
The power of a city is the total number of power stations it is being provided power from.
The government has sanctioned building k
more power stations, each of which can be built in any city, and have the same range as the pre-existing ones.
Given the two integers r
and k
, return the maximum possible minimum power of a city, if the additional power stations are built optimally.
Note that you can build the k
power stations in multiple cities.
Example 1:
Input: stations = [1,2,4,5,0], r = 1, k = 2 Output: 5 Explanation: One of the optimal ways is to install both the power stations at city 1. So stations will become [1,4,4,5,0]. - City 0 is provided by 1 + 4 = 5 power stations. - City 1 is provided by 1 + 4 + 4 = 9 power stations. - City 2 is provided by 4 + 4 + 5 = 13 power stations. - City 3 is provided by 5 + 4 = 9 power stations. - City 4 is provided by 5 + 0 = 5 power stations. So the minimum power of a city is 5. Since it is not possible to obtain a larger power, we return 5.
Example 2:
Input: stations = [4,4,4,4], r = 0, k = 3 Output: 4 Explanation: It can be proved that we cannot make the minimum power of a city greater than 4.
Constraints:
n == stations.length
1 <= n <= 105
0 <= stations[i] <= 105
0 <= r <= n - 1
0 <= k <= 109
代码结果
运行时间: 864 ms, 内存: 29.1 MB
/*
题目思路:
1. 使用 Java Stream API 实现题解。
2. 通过将数组转换为流进行处理。
3. 计算每个城市在给定范围内的电量。
4. 使用二分搜索找到最小的最大电量。
*/
import java.util.Arrays;
import java.util.stream.IntStream;
public class Solution {
public int maxPower(int[] stations, int r, int k) {
int n = stations.length;
long left = 0, right = (long) 1e18;
while (left < right) {
long mid = (left + right) / 2;
if (canAchieve(stations, r, k, mid)) {
right = mid;
} else {
left = mid + 1;
}
}
return (int) left;
}
private boolean canAchieve(int[] stations, int r, int k, long target) {
int n = stations.length;
long[] power = Arrays.stream(stations).mapToLong(i -> i).toArray();
long additional = 0;
for (int i = 0; i < n; i++) {
if (i > 0) power[i] += power[i - 1];
if (i >= 2 * r + 1) power[i] -= stations[i - 2 * r - 1];
if (power[i] < target) {
long add = target - power[i];
additional += add;
if (additional > k) return false;
power[i] += add;
if (i + r + 1 < n) stations[i + r + 1] += add;
}
}
return true;
}
}
解释
方法:
时间复杂度:
空间复杂度: