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