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

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



相关推荐
周末也要写八哥29 分钟前
经典算法实例:游戏中弱角色的数量(二)
算法
是Yu欸44 分钟前
鸿蒙PC移植:2048 从网页小游戏到 AI 桌面应用
大数据·人工智能·算法·数据挖掘·openharmony·codex
鹿角片ljp1 小时前
KV Cache 解析
java·算法
captain3761 小时前
网络原理(9)-数据链路层
java·网络协议·java-ee
liliangcsdn1 小时前
IVOL与偏度因子的对比测量分析
算法
惊讶的猫2 小时前
意图识别置信度和检索重排的分数
java
caoerzhong2 小时前
仓库管理数字化趋势解读:JeeWMS 开源 Java WMS 视角下的五个演进方向
java·开源
程序员JerrySUN2 小时前
Jetson Edge AI 实战01:Nano、Xavier、Orin 怎么选?Jetson 硬件选型详解【视频讲解】
java·数据库·redis·安全·mybatis
threerocks3 小时前
Jev 入门第一课
算法