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

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);
        }
    }
}



相关推荐
z200509303 小时前
每日简单算法题——————跟着卡尔
算法
budingxiaomoli4 小时前
Spring IoC &DI
java·spring·ioc·di
Spider Cat 蜘蛛猫4 小时前
Springboot SSO系统设计文档
java·spring boot·后端
未若君雅裁4 小时前
MySQL高可用与扩展-主从复制读写分离分库分表
java·数据库·mysql
学习中.........4 小时前
从扰动函数的变化,感受红黑树带来的性能提升
java
️是784 小时前
信息奥赛一本通—编程启蒙(3395:练68.3 车牌问题)
数据结构·c++·算法
Liangwei Lin4 小时前
LeetCode 118. 杨辉三角
算法·leetcode·职场和发展
计算机安禾4 小时前
【c++面向对象编程】第24篇:类型转换运算符:自定义隐式转换与explicit
java·c++·算法
鼠鼠我(‘-ωก̀ )好困4 小时前
leetGPU
算法
我星期八休息5 小时前
Linux系统编程—基础IO
linux·运维·服务器·c语言·c++·人工智能·算法