【每日一题Day58】LC1785构成特定和添加的最少元素 | 贪心

简介: 思路:首先统计数组nums的和sum,然后计算sum与goal的差target,我们需要向数组中添加最少的元素,使元素的和满足差值,元素的个数即为最终结果,因此每次添加的元素应尽可能最大。由于添加数值的绝对值大小受limit限制,因此添加元素的数值绝对值为limit的个数为Math.abs(target)/limit,如果Math.abs(target)不等于0,那么还需添加一个元素使和等于target

构成特定和添加的最少元素【LC1785】


You are given an integer array nums and two integers limit and goal. The array nums has an interesting property that abs(nums[i]) <= limit.


Return the minimum number of elements you need to add to make the sum of the array equal to goal. The array must maintain its property that abs(nums[i]) <= limit.


Note that abs(x) equals x if x >= 0, and -x otherwise.


2022/12/16


跟LC1827最少操作数使数组递增这题很类似,还更简单些


  • 思路:首先统计数组nums的和sum,然后计算sum与goal的差target,我们需要向数组中添加最少的元素,使元素的和满足差值,元素的个数即为最终结果,因此每次添加的元素应尽可能最大。由于添加数值的绝对值大小受limit限制,因此添加元素的数值绝对值为limit的个数为Math.abs(target)/limit,如果Math.abs(target)不等于0,那么还需添加一个元素使和等于target


【贪心】


。局部最优:每次添加的元素应尽可能最大

。全局最优:添加的元素个数最少


  • 实现


为了防止越界使用long类型变量存储target


class Solution {
    public int minElements(int[] nums, int limit, int goal) {
        long target = (long) goal;
        int count = 0;
        for (long num : nums){
            target -= num;
        }
        count += Math.abs(target) / limit;       
        return Math.abs(target) % limit == 0 ? count : count + 1;
    }
}


。复杂度


  • 时间复杂度:O ( n )
  • 空间复杂度:O ( 1 )
目录
相关文章
|
5月前
【每日一题Day266】LC18四数之和 | 排序+双指针
【每日一题Day266】LC18四数之和 | 排序+双指针
39 1
|
5月前
【每日一题Day175】LC1147段式回文 | 贪心 +双指针
【每日一题Day175】LC1147段式回文 | 贪心 +双指针
41 0
|
5月前
【每日一题Day366】LC2103环和杆 | 状态压缩
【每日一题Day366】LC2103环和杆 | 状态压缩
43 0
|
5月前
【每日一题Day302】LC849到最近的人的最大距离 | 贪心+分类讨论
【每日一题Day302】LC849到最近的人的最大距离 | 贪心+分类讨论
53 0
|
5月前
【每日一题Day331】LC2560打家劫舍 IV | 二分查找 + 贪心
【每日一题Day331】LC2560打家劫舍 IV | 二分查找 + 贪心
36 0
|
5月前
【每日一题Day149】LC2389和有限的最长子序列 | 贪心+前缀和+二分查找
【每日一题Day149】LC2389和有限的最长子序列 | 贪心+前缀和+二分查找
41 0
|
5月前
【每日一题Day150】LC1616分割两个字符串得到回文串 | 双指针+贪心
【每日一题Day150】LC1616分割两个字符串得到回文串 | 双指针+贪心
35 0
|
5月前
|
机器学习/深度学习
【每日一题Day196】LC2106摘水果 | 枚举+前缀和数组 同向双指针+二分查找
【每日一题Day196】LC2106摘水果 | 枚举+前缀和数组 同向双指针+二分查找
52 0
|
5月前
【每日一题Day306】LC228汇总区间 | 双指针
【每日一题Day306】LC228汇总区间 | 双指针
37 0
|
5月前
【每日一题Day249】LC1186删除一次得到子数组最大和 | 动态规划
【每日一题Day249】LC1186删除一次得到子数组最大和 | 动态规划
41 0