用 Python 编写程序来查找最接近子序列和
假设我们有一个数组 nums 和另一个值 goal。我们想要选择一个 nums 子序列,使得其元素和最接近 goal。换句话说,如果子序列元素和为 s,那么我们想要最小化绝对差 |s - goal|。
因此,我们必须找到 |s - goal| 的最小可能值。 因此,如果输入为 nums = [8,-8,16,-1] goal = -3,则输出将为 2,因为选择子序列 [8,-8,-1],其和为 -1。绝对差为 |-1 - (-3)| = abs(2) = 2,这是最小值。
为了解决这个问题,我们将遵循以下步骤 −
n := nums 的大小
在获得 x 的绝对值后,根据负值对 nums 进行排序
neg := 创建一个大小为 n+1 的数组并用 0 填充
pos := 创建一个大小为 n+1 的数组并用 0 填充
对于 i 在 n-1 到 0 的范围内,减少 1,执行
如果 nums[i] < 0,则
neg[i] := neg[i+1] + nums[i]
pos[i] := pos[i+1]
否则,
pos[i] := pos[i+1] + nums[i]
neg[i] := neg[i+1]
ans := |goal|
s := 一个新的集合并向其中插入 0
定义一个函数 check() 。这将需要 a、b
如果 b < goal - ans 或 goal + ans < a,然后
返回 False
返回 True
从主方法,执行以下操作
对于 0 到 n - 1 范围内的 i,执行
sl := x 列表,对于 s 中的所有 x,当 check(x+neg[i], x+pos[i] 为真时]
如果 sl 的大小与 0 相同,则
退出循环
s := 来自 sl 的新集合
对于 sl 中的每个 x,执行
y := x + nums[i]
如果 |y - goal| < ans,则
ans := |y - goal|
如果 ans 与 0 相同,则
返回 0
将 y 插入 s
返回 ans
示例
让我们看看下面的实现以便更好地理解
from collections import Counter def solve(nums, goal): n = len(nums) nums.sort(key=lambda x: -abs(x)) neg = [0 for _ in range(n+1)] pos = [0 for _ in range(n+1)] for i in range(n-1, -1, -1): if nums[i] < 0: neg[i] = neg[i+1] + nums[i] pos[i] = pos[i+1] else: pos[i] = pos[i+1] + nums[i] neg[i] = neg[i+1] ans = abs(goal) s = set([0]) def check(a, b): if b < goal - ans or goal + ans < a: return False return True for i in range(n): sl = [x for x in s if check(x+neg[i], x+pos[i])] if len(sl) == 0: break s = set(sl) for x in sl: y = x + nums[i] if abs(y - goal) < ans: ans = abs(y - goal) if ans == 0: return 0 s.add(y) return ans nums = [8,-8,16,-1] goal = -3 print(solve(nums, goal))
输入
[0,1,2,3,4], [[3,1],[1,3],[5,6]]
输出
2
相关文章
有用资源
python 参考教程 - 该教程包含有关 python 的更多信息:https://www.cainiaomax.com/python/

