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

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



相关推荐
京师20万禁军教头8 小时前
50-常用类-Arrays
java
寰梦8 小时前
Spring Boot + MinIO 大文件上传完整实战:MD5 秒传、分片上传、断点续传与引用一致性
java·spring boot·文件上传·minio
旖旎夜光8 小时前
LCR 170:交易逆序对的总数(归并排序) —— 题解
c++·学习·算法·leetcode·排序算法
微尘hjx16 小时前
【ByteTrack 04】多轨迹算法ByteTrack改进点
算法·yolo·目标检测·目标跟踪·bytetrack·ultralytics·车跟踪
云和数据.ChenGuang16 小时前
Python 重写(Override)深度解析:从 MRO 到 super() 的完整机制
java·开发语言·人工智能·python·langchain·1024程序员节
摇滚侠16 小时前
《On Java 中文版 基础卷》阅读笔记 实现隐藏 12
java·数据库·笔记
silvamux_19 小时前
10款模型写种草笔记:可发布性、返工来源与成本数据缺口复盘
java·数据库·笔记
步行cgn20 小时前
StringHttpMessageConverter 详解:Spring MVC 中字符串读写的默认转换器
java·spring·mvc
摇滚侠20 小时前
《On Java 中文版 基础卷》阅读笔记 实现隐藏 11
java·笔记·python