java - 求出满足 min(S) + max(S) <= K 的非空子集 S 的数量
问题描述
对于给定的整数向量和 integer K
,找到非空子集的数量,S
使得min(S) + max(S) <= K
例如,对于K = 8
和 vector [2, 4, 5, 7]
,解是 5: ([2], [4], [2, 4], [2, 4, 5], [2, 5])
。时间复杂度应该是 O(n^2)。
解决方案
在算法方面:正如您已经说过的,有一个(基本)解决方案,我们计算所有子集;但迭代子集具有指数复杂性。
我们可以优化计数:在示例中考虑集合S=[1,2,3,4,5,6]
,我们想要计算同时包含1
和的所有子集6
。1到6之间有4个项目;并且我们计算的所有子集将包含或不包含任何[2,3,4,5]
. 由于它们是 4 个项目,因此存在2^4
不同的子集。
所以对于解决方案;您可以遍历数组(复杂性N
)并选择最小值;遍历以下项目并选择最大值(N
再次复杂度);并计算 和 之间的子集数i
(j
它们是2^n
)。
推荐阅读
- python - Stackoverflow:有效地获得每行数据帧中从小到大的顺序
- kendo-ui - Kendo Grid 未显示返回正确 json 的数据
- c# - 我应该提交实体框架迁移吗?
- python - 将列表附加到结果列表会不断替换最后一个附加的列表
- r - 更改图例中指示值的点大小的缩放比例
- css - 为弹性容器中的多个项目添加渐变
- timezone - Debian Stable for Casablanca 上的 TZ 数据库忽略了对 DST 的永久更改并添加了偏移量 1
- java - 我正在尝试从用户那里获取输入并将其传输到文本文件
- jinja2 - Jinja 的定义与 if variable_name 有什么区别?
- java - 有没有办法从 Visual Studio Windows 窗体应用程序调用 Java 类?