刷题的日常-构成特定和需要添加的最少元素

56 阅读2分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第24天,点击查看活动详情

整个部门G

刷题的日常-2022年12月16号

一天一题,保持脑子清爽

构成特定和需要添加的最少元素

来自leetcode的 1785 题,题意如下:

给你一个整数数组 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

理解题意

通过题意,我们可以将信息整理如下:

  • 题目给出一个数组,一个限制值 和一个 目标值
  • 要求对数组的值进行汇总计算,如果不足目标值,则往数组里添加,最大为限制值的一个数
  • 返回最小的添加次数

做题思路

说白了就是求两个数字的差值,然后看差值对limit相除,最后如果余数大于0的话,还要加上1。

第一个实现

用int值对数组的进行累加,最后算出差值,和limit相除。但是最后两测试用例溢出了,导致出错。

第二个实现

用BigDecimal API进行暴力,能过,没什么好说的

最后一个实现

没想到用long能过,思路和第一个实现一样,只是相加的过程中用long记录了,最后返回差异值和limit的相除结果,然后强转成int就可以了

代码实现

代码实现如下:

class Solution {
    public int minElements(int[] nums, int limit, int goal) {
        long sum = 0;
        for (int x : nums) {
            sum += x;
        }
        long diff = Math.abs(sum - goal);
        return (int) ((diff + limit - 1) / limit);
    }
}

image.png