当前位置: 首页 > news >正文

Leetcode 组合总和 III

在这里插入图片描述

回溯法

java solution

class Solution {
    public List<List<Integer>> combinationSum3(int k, int n) {
        //先创建返回的结果
        List<List<Integer>> result = new ArrayList<>();

        //然后开始回溯
        backtrack(k, n, 1, new ArrayList<>(), result);
        //返回结果
        return result;
    }
    private void backtrack(int k, int remain, int start, List<Integer> path, List<List<Integer>> result) {
        //首先判断是否满足条件,如果剩余和等于0且当前组合的长度为k, 添加当前path到result中,然后返回
        if(path.size() == k && remain == 0) {
            result.add(new ArrayList<>(path));
            return;
        }

        //然后进行剪枝, 组合长度超过k 或者 remain < 0 时需要剪枝
        if(path.size() > k || remain < 0) return;

        //回溯

        for(int i = start; i <= 9; i++) {
            path.add(i);
            //添加之后进行回溯判断
            backtrack(k, remain - i, i + 1, path, result);
            path.remove(path.size() - 1);
        }

    }
}

一个通用的回溯模板


✅ 回溯算法的经典模板(Backtracking Template)

void backtrack(参数...) {
    if (满足合法解的条件) {
        // 处理合法结果(加入答案列表等)
        return;
    }

    if (触发剪枝条件) {
        // 过早结束(比如路径过长、和超了等)
        return;
    }

    for (int i = 起始位置; i <= 边界; i++) {
        // 做选择
        路径.add(i);

        // 递归,进入下一层决策树
        backtrack(...);

        // 撤销选择(回溯)
        路径.remove(路径.size() - 1);
    }
}

🧠 关键步骤详解:

① 判断合法结果:

if (路径.size() == k && remain == 0)

这个时候你已经找到了一个完整的结果,可以加入答案。


② 剪枝条件(终止非法路径):

if (路径.size() > k || remain < 0)

当路径已经无效(长度超了或者和超了),就不需要继续递归了,直接 return。


③ 遍历所有可能选项:

for (int i = start; i <= 9; i++)

依次尝试选取每一个可能的数字。


④ 做选择:

path.add(i)

当前这个数加入路径。


⑤ 回溯递归:

backtrack(...)

进入下一层决策树。


⑥ 撤销选择(回溯):

path.remove(path.size() - 1)

关键操作:撤回上一次的选择,回到上一步的状态,尝试新的可能。


✅ 常见题目都能用这个套路,比如:

  • 组合问题(如本题)
  • 排列问题(比如 Leetcode 46/47)
  • 子集问题
  • 数独、N皇后、迷宫路径
  • 分割字符串、括号生成…

相关文章:

  • 计算机期刊征稿 | 计算机-网络系统:物联网系统架构、物联网使能技术、物联网通信和网络协议、物联网服务和应用以及物联网的社会影响
  • android studio 运行flutter项目
  • 提示词工程 — 科研论文笔记
  • 软件工程面试题(八)
  • 文章记单词 | 第14篇(六级)
  • 【极速版 -- 大模型入门到进阶】LORA:大模型轻量级微调
  • vsCode项目创建python虚拟环境
  • ECharts折线图源码合集1(共18个自定义图表),附视频讲解与代码下载
  • 深入理解 Hook 系统函数技术
  • Vala 编程语言教程-继承
  • 利用c#书写调用MVS书写的图片处理文件.sol
  • [C++开发经验总结]何时用push?/何时用emplace?
  • Flask项目部署:Flask + uWSGI + Nginx
  • 维智 Harmony NEXT 定位 SDK:鸿蒙生态下的空间智能应用实践
  • 软件兼容性测试的矩阵爆炸问题有哪些解决方案
  • Unity UGUI - 六大基础组件
  • GNSS数据说明-RTCM
  • 简单谈谈很火的MCP( Model Context Protocol,模型上下文协议)
  • 【Sql Server】在SQL Server中生成雪花ID(Snowflake ID)
  • HarmonyOS NEXT状态管理实践
  • 网站备案帐号找回/游戏推广员上班靠谱吗
  • 门户网站建设与运行情况良好/windows优化大师卸载不掉
  • 网站建设 技术指标/企业软文营销
  • 深圳坂田网站建设/seo网站推广软件排名
  • 今日国内新闻头条/嘉兴网站建设方案优化
  • 如何用百度搜自己做的网站/百度排行榜风云