如何修改代码生成长度不超过k的子集?已有精确长度k子集生成代码
生成所有长度不超过k的子集实现方案
你现有的代码只能生成精确长度为k的子集,要改成生成所有长度≤k的子集,只需要调整两个核心逻辑:
- 移除原代码中「只有当子集长度等于k时才输出」的限制,改为每进入递归就输出当前子集(这样就能覆盖从长度0到k的所有情况)
- 新增终止条件:当当前子集长度已经达到k时,不再继续选择后续元素(避免生成长度超过k的子集)
修改后的完整代码如下:
import java.util.ArrayList; import java.util.List; public class SubsetGenerator { public static void pset(List<Integer> original, List<Integer> lst, int k, int idx) { // 每一步都输出当前子集,覆盖所有长度≤k的情况 System.out.println(lst); // 终止条件1:子集长度已达k,停止继续选元素 if (lst.size() == k) { return; } // 终止条件2:遍历完所有原数组元素,返回 if (idx == original.size()) { return; } // 选择当前元素,继续递归 lst.add(original.get(idx)); pset(original, lst, k, idx + 1); // 回溯,撤销选择 lst.remove(lst.size() - 1); // 不选择当前元素,继续递归 pset(original, lst, k, idx + 1); } public static void main(String[] args) { var original = List.of(1, 2, 3, 4); // 生成所有长度≤2的子集 pset(original, new ArrayList<>(), 2, 0); } }
关键改动说明:
- 把原代码中
if(lst.size() == k)里的输出逻辑移到方法开头,这样每次递归都会输出当前的子集(包括空集、长度1、长度2...直到长度k的子集) - 保留
lst.size() == k作为终止条件,此时不再继续递归选元素,避免生成超过k长度的子集
运行结果示例(k=2时):
[] [1] [1, 2] [1, 3] [1, 4] [2] [2, 3] [2, 4] [3] [3, 4] [4]
这样就会输出原数组所有长度从0到k的子集,完全符合需求。
内容的提问来源于stack exchange,提问作者curiousengineer
相关产品推荐
相关产品推荐

