算法日志 --- 12.16--- 构成特定和需要添加的最少元素

82 阅读2分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 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;
    }
}

image.png