1.题目描述
给你一个整数数组 nums ,和两个整数 limit 与 goal 。数组 nums 有一条重要属性:abs(nums[i]) <= limit 。
返回使数组元素总和等于 goal 所需要向数组中添加的 最少元素数量 ,添加元素 不应改变 数组中 abs(nums[i]) <= limit 这一属性。
注意,如果 x >= 0 ,那么 abs(x) 等于 x ;否则,等于 -x 。
示例 1:
输入:nums = [1,-1,1], limit = 3, goal = -4
输出:2
解释:可以将 -2 和 -3 添加到数组中,数组的元素总和变为 1 - 1 + 1 - 2 - 3 = -4 。
示例 2:
输入:nums = [1,-10,9,1], limit = 100, goal = 0
输出:1
2.解题思路与代码
2.1 解题思路
这道题目我们需要先计算出数组 nums 的总和,然后计算与 goal 差值的绝对值。在得到目标差值 target 之后,就需要与 limit 进行比较了。如果 target<=limit ,那么就只需要放入一个等于 target 的数即可,如果 target>limit 的时候要让放入数字个数最少,那么我们肯定就从能添加的最大的数 limit 开始放,放入个数为 ans=target/limit 个,此时如果恰好没有剩余的数,直接返回 ans 即可,还有剩余,那么这个剩余数一定是小于 limit 的也就是说需要在放入一次,即返回 ans+1。
2.2 代码
class Solution {
public int minElements(int[] nums, int limit, int goal) {
long sum = 0;
for (int num : nums) {
sum += num;
}
long target = Math.abs(goal - sum);
int ans = (int) (target / limit);
return target % limit == 0 ? ans : ans + 1;
}
}
2.3 测试结果
通过测试
测试结果
3.总结
- 注意使用 long 存放总和,避免越界