LC-1775.通过最少操作次数使数组的和相等
题目描述
给你两个长度可能不等的整数数组 nums1 和 nums2 。两个数组中的所有值都在 1 到 6 之间(包含 1 和 6)。
每次操作中,你可以选择 任意 数组中的任意一个整数,将它变成 1 到 6 之间 任意 的值(包含 1 和 6)。
请你返回使 nums1 中所有数的和与 nums2 中所有数的和相等的最少操作次数。如果无法使两个数组的和相等,请返回 -1 。
示例1:
1 |
|
提示1:
1 |
|
贪心
设两个数组的和为 $sum1$ 、$sum2$,两者的差为 $diff$ 。
并且为了不失一般性,我们使 $nums1$ 的和始终是大于 $nums2$ 的。
因为需要通过最少次数使两个数组和相等,也就是使 $diff$ 尽快小于 $0$。那么为了更快的减少 $diff$ ,显然我们只能令 $nums1$ 中的某个数 $x$ 变成 $max(1, x - diff))$,这样一来 $x$ 对 $diff$ 贡献即为 $x - max(1, x - diff)$,同样为了更快的减少 $diff$ ,我们要尽可能的从更大贡献值的 $x$ 开始操作;对于 $num2$ 也同理,近似的改成相反操作即可。
1 |
|
哈希表优化
上面的解法代码过于复杂,我们可以通过哈希表来存储不同元素对于 $diff$ 的贡献,这样一来只需要从大到小遍历贡献值以减少 $diff$ 即可。
1 |
|
LC-1775.通过最少操作次数使数组的和相等
https://wecgwm.github.io/2022/12/08/LC-1775-通过最少操作次数使数组的和相等/