5698. 构成特定和需要添加的最少元素
前言
提示:leetcode做题一定要看清楚题目,如果不懂题目可以去评论区看看大家对题目的理解。
忌讳:不懂题目的意思就答题
题目描述:
一、解题关键
贪心算法,查看题目是否可以用贪心算法。初期可以查看这几个关键词:“最少”,“最多”,“最大”,“最小”…
"最"关键字一般都可以用贪心
后期题目做多了,自然水到渠成一眼救能看出,使用什么算法
一、我的答案
时间复杂度: O(1) ,空间复杂度: O(1)1.1 注意内容:
- 题目描述中给的负数是障眼法,直接取其绝对值就好。
- 因为num[i] <=106 && num.length <= 105,所以计算时需要使用long,使用int会缺失精度
1.2 思路
因为题目是要给数组添加最少的元素,使其等于goal值。而添加的值的绝对值要小于 limit。根据者两点,我们可以得出不用去考虑,添加什么值。只要考虑在数组中添加的limit个数(因为添加的数越大,则加入数组的数字最少)
public int minElements(int[] nums, int limit, int goal) {
// 计算nums的和
long sum=0;
for (int num:nums){
sum+=num;
}
// 计算还需要添加的值,才能等于 goal
long value = Math.abs(goal - sum);
// 使用还需要添加的值 除以 limit得出,在数组中添加的最少元素个数
int count = (int)((value) / (limit)); // 能整除,在数组添加的个数就是 count
if ((value % limit) != 0) {
// 不能整除,还需要在数组中添加一个数才能等于 goal
count++;
}
return count;
}
PS: 题目做多了,自然水到渠成一眼救能看出,使用什么算法