【2022-12-16每日一题】1785. 构成特定和需要添加的最少元素[Medium]

2022-12-16
1分钟阅读时长

2022-12-16每日一题:1785. 构成特定和需要添加的最少元素

难度:Medium

标签:贪心 、 数组

给你一个整数数组 nums ,和两个整数 limitgoal 。数组 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 。

示例 2:

输入:nums = [1,-10,9,1], limit = 100, goal = 0
输出:1

提示:

  • 1 <= nums.length <= 105
  • 1 <= limit <= 106
  • -limit <= nums[i] <= limit
  • -109 <= goal <= 109

方法一:累加和+贪心

写法一

func minElements(nums []int, limit int, goal int) int {
    sum := 0
    for _, num := range nums {
        sum += num
    }
    goal -= sum
    if goal < 0 {
        goal = -goal
    }
    return (goal + limit - 1) / limit // 向上取整
}

写法二

func minElements(nums []int, limit, goal int) int {
    sum := 0
    for _, x := range nums {
        sum += x
    }
    diff := abs(sum - goal)
    return (diff + limit - 1) / limit // 向上取整
}

func abs(x int) int {
    if x < 0 {
        return -x
    }
    return x
}

复杂度分析

  • 时间复杂度:$O(n)$。
  • 空间复杂度:$O(1)$。

LeetCode题库地址