You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何修改代码生成长度不超过k的子集?已有精确长度k子集生成代码

生成所有长度不超过k的子集实现方案

你现有的代码只能生成精确长度为k的子集,要改成生成所有长度≤k的子集,只需要调整两个核心逻辑:

  1. 移除原代码中「只有当子集长度等于k时才输出」的限制,改为每进入递归就输出当前子集(这样就能覆盖从长度0到k的所有情况)
  2. 新增终止条件:当当前子集长度已经达到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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.21 06:42:46