python-leetcode-1785. 构成特定和需要添加的最少元素

1785. 构成特定和需要添加的最少元素 - 力扣(LeetCode)

需要通过添加元素使数组 nums 的总和达到 goal,并且每个添加的元素的绝对值不能超过 limit

思路

  1. 计算当前数组的总和

    • 计算 nums 的总和 sum_nums
  2. 计算所需的增量(或减少量)

    • 计算 diff = abs(goal - sum_nums),即我们需要填补的差值。
  3. 计算最少需要添加的元素个数

    • 每个新添加的元素的绝对值最多是 limit,所以我们希望用尽可能少的数来填补 diff
    • 计算所需的最小元素数 count = ceil(diff / limit),即 count = (diff + limit - 1) // limit

代码实现

from math import ceil

def minElements(nums, limit, goal):
    sum_nums = sum(nums)  # 计算当前数组的总和
    diff = abs(goal - sum_nums)  # 计算目标差值
    return (diff + limit - 1) // limit  # 计算最小元素个数

# 测试用例
print(minElements([1, -1, 1], 3, -4))  # 输出: 2
print(minElements([1, 2, 3], 5, 10))   # 输出: 1

复杂度分析

  • 计算数组总和的时间复杂度是 O(n),其中 nnums 的长度。
  • 计算 diffcount 只需 O(1) 时间。
  • 总时间复杂度:O(n),适用于大数据量的情况。

示例

假设 nums = [1, -1, 1]limit = 3goal = -4

  1. sum_nums = 1 + (-1) + 1 = 1
  2. diff = abs(-4 - 1) = 5
  3. 需要的最少元素数 count = (5 + 3 - 1) // 3 = 2(即两个 -3)

最终,我们最少需要添加 2 个元素使数组总和变为 goal

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值