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

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



相关推荐
晓晓_za8986682 分钟前
GEO 搜索源码白帽合规改造:适配各大 AI 信源收录规则
java·开发语言·人工智能·性能优化·开源
Haooog3 分钟前
从 Tool Calling 到 State 并发控制:一个 Agent 如何安全地连续执行任务
java·agent·后端开发
君顾119 分钟前
从0到1课后辅导管理系统开发实战:需求文档、架构设计全复盘
java·开发语言
NeoGressAI外贸数字化25 分钟前
外贸建站:新手怎么自建独立站完整指南
java·人工智能
前端 贾公子27 分钟前
第09章:上下文与记忆 (4)
java·服务器·前端
HanhahnaH33 分钟前
各数据结构操作的时间复杂度汇总
数据结构·算法
wjjzhbb39 分钟前
中小团队敏捷转型:Scrum还是看板?
java·maven·scrum
Yzzz-F1 小时前
CF2023D
c++·算法·dp
GodSure09141 小时前
Java单一职责原则SRP详解
java·python·单一职责原则
探数API小喇叭1 小时前
基站查询 API 怎么用?LAC、CELLID 参数详解与实战】
java·开发语言·api·基站定位