开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第25天,点击查看活动详情
中招了,自己也是个小阳人
构成特定和需要添加的最少元素
该题出自力扣的1785题 —— 构成特定和需要添加的最少元素【简单题】
审题
给你一个整数数组 nums ,和两个整数 limit 与 goal 。数组 nums 有一条重要属性:abs(nums[i]) <= limit 。 返回使数组元素总和等于 goal 所需要向数组中添加的 最少元素数量 ,添加元素 不应改变 数组中 abs(nums[i]) <= limit 这一属性。 注意,如果 x >= 0 ,那么 abs(x) 等于 x ;否则,等于 -x 。
-
这道题的题意并不算复杂,但是需要一些技巧,给出一个整型数组,两个整型变量
- 数组记录的是存在的值
- 变量limit 记录的是阈值,数组内的每个值不得超过limit
- goal变量指的是最终需要达到的值
-
按照这个业务规则,那么就是对数据的汇总并且计算出与变量goal的距离(差值)
-
一开始没有注意到数值的大小,用了stream的sum方法,返回的是int,很明显就会超出距离,因此不能使用这个方法,并且要使用long型
-
解题:
- 利用for循环去处理这个数组的叠加,通过遍历一次循环求出数组的和,因为担心越界,还是用了long型
- 计算出总数与goal变量的差距,对差值进行取绝对值,只考虑差值为正的情况
- 返回总数与limit变量的除余并且向上取整
-
先计算数组元素总和 s,然后计算 s 与 goal 的差值的绝对值 d。
-
sum / n向上取整 ==(sum + n - 1) / n向下取整
编码
class Solution {
public int minElements(int[] nums, int limit, int goal) {
long sum = 0;
for(int n: nums)sum += n;
long res = Math.abs(sum - goal);
return (int)Math.ceil((double)res/limit);
// if (res > limit){
// int i = (int)(res / limit);
// if (res % limit != 0) {
// i++;
// }
// return i;
// }else return 1;
}
}