使数组相等的最小开销
难度:
标签:
题目描述
代码结果
运行时间: 64 ms, 内存: 35.3 MB
/*
* 思路:
* 1. 使用Java Stream来简化计算和代码。
* 2. 通过二分查找找到使总开销最小的目标值。
* 3. 使用流来计算每个目标值对应的总开销。
*/
import java.util.stream.IntStream;
public class Solution {
public long minCost(int[] nums, int[] cost) {
int left = 1, right = 1000000;
while (left < right) {
int mid = (left + right) / 2;
long cost1 = getCost(nums, cost, mid);
long cost2 = getCost(nums, cost, mid + 1);
if (cost1 > cost2) {
left = mid + 1;
} else {
right = mid;
}
}
return getCost(nums, cost, left);
}
private long getCost(int[] nums, int[] cost, int target) {
return IntStream.range(0, nums.length)
.mapToLong(i -> (long) Math.abs(nums[i] - target) * cost[i])
.sum();
}
}
解释
方法:
这个题解利用了"成本加权中位数"的概念来找到一个目标值,使得将所有数组元素变成这个值的总成本最小。首先通过对数组nums和cost的zip操作合并,然后根据nums值进行排序。排序后,计算累积成本直到超过总成本的一半,此时对应的nums中的值作为目标值最佳。最后,计算使所有nums元素变为此目标值的成本和。
时间复杂度:
O(n log n)
空间复杂度:
O(n)
代码细节讲解
🦆
题解中提到了'成本加权中位数',能否详细解释这个概念是如何应用在这个问题上的?
▷🦆
在题解中,为什么在累积成本超过总成本的一半时,此时的`nums`值就能作为最佳目标值?
▷🦆
题解中排序的目的是什么,对算法的正确性和效率有什么影响?
▷🦆
如果数组`nums`所有元素相等,题解中的算法是否还会有效,会有什么特殊情况?
▷