注意,本题中数组元素的数据范围为
,元素个数最大为
,总和以及差值
可能会超过 int(
),因此我们使用long long
1、自己写的 - 贪心
思路:
- 差值正负是一样的,比如-5由-3和-2组成,是2个数,5由3和2组成,也是2个数,所以直接取绝对值即可
- 因为个数要最小,所以从边界最大数倒着枚举,看能加最多多少个i,然后将差值减去
class Solution {
public:
int minElements(vector<int>& nums, int limit, int goal) {
long long sum=0;
for(int x:nums) sum+=x;
long long d=abs(goal-sum);
int cnt=0;
for(long long i=limit;i>0;i--)
{
int t=0; //记录本次用掉的个数
if(d==0) break;
cnt+=d/i,t=d/i,d-=i*t;
}
return cnt;
}
};
2、向上取整
先计算数组元素总和 s,然后计算 s 与 goal 的差值的绝对值 d。
那么需要添加的元素数量为 d 除以 limit 向上取整,即
向上取整公式
![]()
(a+b-1)/ b
ceil(1.0*a/b) 向上取整函数
class Solution {
public:
int minElements(vector<int>& nums, int limit, int goal) {
long long sum=0;
for(int x:nums) sum+=x;
long long d=abs(goal-sum);
return (d+limit-1)/limit;
}
};
class Solution {
public:
int minElements(vector<int>& nums, int limit, int goal) {
long long sum=0;
for(int x:nums) sum+=x;
long long d=abs(goal-sum);
return ceil(d*1.0/limit);
}
};