力扣--组合,子集--回溯法的再探索--总结回溯法

1.组合




java 复制代码
package siyangyuan;

import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;

/**
 * Class Name :zuhe
 * Package :siyangyuan
 * Description:
 *
 * @Author: Mr.chunxugao
 * Create: 2026-03-14- 19:24
 * @Version:v1.0
 */
public class zuhe {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        // 2. 提示输入 & 读取数字
        System.out.print("请输入数字 n(范围 1~n):");
        int n = sc.nextInt();

        System.out.print("请输入数字 k(每组 k 个数):");
        int k = sc.nextInt();

       List<List<Integer>> result= combine(n,k);

        // 4. 输出最终结果
        System.out.println(n + " 中选 " + k + " 个的所有组合:");
        System.out.println(result);
    }
    public static  List<List<Integer>> combine(int n,int k){
        List<List<Integer>> res=new ArrayList<>();
        List<Integer> path=new ArrayList<>();
          backtrack(n,k,1,res,path);
          return res;
    }

    public static void backtrack(int n,int k,int start, List<List<Integer>> res,List<Integer> path) {

        //如果到了路径的长度,就添加并且返回
        if(path.size()==k){
            res.add(new ArrayList<>(path));
            return;
        }
        //
        for(int i=start;i<=n;i++){
            path.add(i);
            backtrack(n,k,i+1,res,path);
            path.remove(path.size()-1);
        }
    }
}

子集

java 复制代码
package siyangyuan;

import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;

/**
 * Class Name :ziji
 * Package :siyangyuan
 * Description:
 *
 * @Author: Mr.chunxugao
 * Create: 2026-03-14- 22:24
 * @Version:v1.0
 */
public class ziji {


    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        System.out.print("请输入数组长度:");
        int n=sc.nextInt();
        System.out.println("请输入数组元素(空格分隔):");
        int[] nums=new int[n];
        for (int i=0;i< nums.length;i++){
            nums[i]=sc.nextInt();
        }

       List<List<Integer>> result= subset(nums);
        System.out.println("子集为");
        System.out.println(result);
    }
    
    //求子集
    public static List<List<Integer>> subset(int[] nums ){

        List<List<Integer>> res=new ArrayList<>();
        List<Integer> path=new ArrayList<>();
        backTarck(nums,0,res,path);
        return res;
    }

    private static void backTarck(int[] nums , int start,List<List<Integer>> res,List<Integer> path) {
        // 【唯一和组合不同的地方】
        // 组合:只有长度=k才存
        // 子集:每一步都存!(空集、1个、2个...全要)
        res.add(new ArrayList<>(path));

        for (int i = start; i < nums.length; i++) {
            //加入
            path.add(nums[i]);
            backTarck(nums,i+1,res,path);//探索
            //回退
            path.remove(path.size()-1);
        }
    }
}



相关推荐
To_OC8 小时前
LC 207 课程表:刚学图论那会儿,我连这是拓扑排序都没看出来
javascript·算法·leetcode
To_OC8 小时前
LC 208 实现 Trie 前缀树:曾被名字劝退,写完发现是送分题
javascript·算法·leetcode
BadBadBad__AK10 小时前
线段树维护区间 k 次方和
c++·数学·算法·stl
吃饱了得干活14 小时前
Spring Cloud Gateway 微服务网关:路由、断言、过滤器
java·spring cloud
lwx5728016 小时前
探秘InnoDB:搞懂它的内存、线程、磁盘与日志刷盘策略
java·后端
Flynt17 小时前
从Spring Boot 4.0升到4.1,我在Maven和gRPC上栽了跟头
java·spring boot·后端
plainGeekDev18 小时前
Activity 间传值 → Navigation 参数
android·java·kotlin
plainGeekDev18 小时前
onActivityResult → ActivityResult API
android·java·kotlin
Sunia18 小时前
《AgentX 专栏》10-生产部署:3台2C4G云服务器把企业级Agent真正跑起来的完整方案
java·架构
ZhengEnCi19 小时前
J7A-高级Java工程师面试三道灵魂拷问-深度广度与工程素养的终极检验
java·后端