【发布时间】:2016-11-23 05:47:43
【问题描述】:
我遇到的问题可以简化为:
给定一个由
N正数组成的数组,找出和最小的恰好是K元素的非连续序列。Ok-ish:只报告总和。奖励:可以识别选择的元素(至少一组索引,如果很多可以实现相同的总和)。
(通俗地说:从 N 个值中选择任意 K 个非相邻元素,使它们的总和最小)
当然,2*K <= N+1(否则无法解决),该问题对正/负不敏感(只需使用 MIN=min(A...) 移动数组值,然后将 K*MIN 添加回答案)。
到目前为止我得到了什么(天真的方法):
- 选择最接近最小值的值的
K+2索引。我不确定这一点,对于K=2,这似乎是涵盖所有特定情况所必需的,但我不知道对于K>2** 是否需要/足够 - 蛮力从上一步产生的索引值的最小总和尊重非连续性标准 - 如果我是对的并且
K+2就足够了,我可以强制使用(K+1)*(K+2)解决方案空间但是,就像我说的。我不确定K+2是否足以满足K>2(如果事实上2*K点是必要的,那么暴力破解就会超出窗口 - 二项式系数C(2*K, K)增长得非常快)
关于如何以最小的时间/空间复杂度完成此任务的任何聪明想法?
** 对于K=2,这是一个重要的示例,其中需要 4 个最接近绝对最小值的值才能选择目标总和 [4,1,0,1,4,3,4] - 不能使用 0 值建立最小和,因为它违反了非连续性标准。
PS - 如果您想展示代码 sn-ps,C/C++ 和/或 Java 将不胜感激,但任何具有良好语法或伪代码的语言都可以使用 (我认为“良好的语法”不包括 Perl ,不是吗?)
【问题讨论】:
-
我会改写如下:在一个数字数组中,找到 k 个不连续的最小元素(它们会产生最小总和的事实是找到那些元素)。
-
你确定所有k个元素都必须是非相邻的吗?严格来说,非连续序列只是意味着任何元素之间至少存在一个间隙。
-
@IngoBürk 绝对确定。所以确保我提供了外行术语的解释,其中强调了 non-neighboring。
-
@FDavidov “我会改写如下:在一个数字数组中,找到 k 个不连续的最小元素”也许是,也许不是 - 我不明白这是怎么回事推动了解决方案。你愿意详细说明吗?
-
所以,你看不到... .Ok... 生成节点的排序列表(从最小到最大),其中每个条目都包含值和它在原始列表中的索引。根据定义,最小值为 IN。然后,开始检查第二个是否与第一个连续,如果不是,将其添加到节点列表中,否则移动到下一个,...您不需要计算不同集合的总和并找到一个产生最小值的。现在更清楚了吗?
标签: algorithm