1785. 构成特定和需要添加的最少元素 - 力扣(LeetCode)
需要通过添加元素使数组 nums
的总和达到 goal
,并且每个添加的元素的绝对值不能超过 limit
。
思路
-
计算当前数组的总和:
- 计算
nums
的总和sum_nums
。
- 计算
-
计算所需的增量(或减少量):
- 计算
diff = abs(goal - sum_nums)
,即我们需要填补的差值。
- 计算
-
计算最少需要添加的元素个数:
- 每个新添加的元素的绝对值最多是
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),其中
n
是nums
的长度。 - 计算
diff
和count
只需 O(1) 时间。 - 总时间复杂度:O(n),适用于大数据量的情况。
示例
假设 nums = [1, -1, 1]
,limit = 3
,goal = -4
:
sum_nums = 1 + (-1) + 1 = 1
diff = abs(-4 - 1) = 5
- 需要的最少元素数
count = (5 + 3 - 1) // 3 = 2
(即两个 -3)
最终,我们最少需要添加 2
个元素使数组总和变为 goal
。