LeetCode216

embedded/2025/2/22 5:53:36/

LeetCode216

目录

  • 题目描述
  • 示例
  • 思路分析
  • 代码段
  • 代码逐行讲解
  • 复杂度分析
  • 总结的知识点
  • 整合
  • 总结

题目描述

找出所有相加之和为 targetk 个数的组合,且满足以下条件:

  • 只使用数字 1 到 9。
  • 每个数字最多使用一次。

返回所有可能的有效组合的列表。组合中不能有相同的组合,组合可以以任何顺序返回。


示例

示例 1

输入:

k = 3, target = 7

输出:

[[1, 2, 4]
]

解释:

  • 1 + 2 + 4 = 7。
  • 没有其他符合条件的组合。

示例 2

输入:

k = 3, target = 9

输出:

[[1, 2, 6],[1, 3, 5],[2, 3, 4]
]

解释:

  • 1 + 2 + 6 = 9。
  • 1 + 3 + 5 = 9。
  • 2 + 3 + 4 = 9。

思路分析

问题核心

我们需要找到所有由 k 个不同数字组成的组合,且这些数字的和为 target。数字的范围是 1 到 9,且每个数字只能使用一次。

思路拆解

  1. 深度优先搜索(DFS)
    • 使用 DFS 遍历所有可能的组合。
  2. 剪枝
    • 如果当前数字大于剩余的目标值 target,则跳过该数字。
  3. 回溯
    • 在 DFS 过程中,使用 stack 记录当前组合,并在回溯时移除最后一个数字。
  4. 终止条件
    • 如果当前组合的长度等于 k 且和为 target,则将其加入结果列表。

代码段

class Solution {public List<List<Integer>> combinationSum3(int k, int target) {List<List<Integer>> result = new ArrayList<>(); dfs(1, target, k, new LinkedList<>(), result); return result;}private static void dfs(int start, int target, int k,LinkedList<Integer> stack,List<List<Integer>> result) {if (target == 0 && stack.size() == k) { result.add(new ArrayList<>(stack));return;}for (int i = start; i <= 9; i++) {if (target < i) { continue;}stack.push(i); dfs(i + 1, target - i, k, stack, result); stack.pop();}}
}

在这里插入图片描述


代码逐行讲解

1. 初始化结果列表

List<List<Integer>> result = new ArrayList<>();
  • result 用于存储所有符合条件的组合。

2. 调用 DFS

dfs(1, target, k, new LinkedList<>(), result);
  • 调用 DFS 函数,传入起始数字 1、目标值 target、组合长度 kstack(用于记录当前组合)和结果列表 result

3. DFS 函数

private static void dfs(int start, int target, int k,LinkedList<Integer> stack,List<List<Integer>> result) {
  • DFS 函数的定义,用于递归生成组合。

4. 找到一个组合

if (target == 0 && stack.size() == k) {result.add(new ArrayList<>(stack));return;
}
  • 如果当前组合的长度等于 k 且和为 target,则将其加入结果列表。

5. 遍历数字 1 到 9

for (int i = start; i <= 9; i++) {
  • start 开始遍历数字 1 到 9,尝试将其加入当前组合。

6. 剪枝

if (target < i) {continue;
}
  • 如果当前数字大于剩余的目标值 target,则跳过该数字。

7. 加入当前数字

stack.push(i);
  • 将当前数字加入当前组合。

8. 递归

dfs(i + 1, target - i, k, stack, result);
  • 递归调用 DFS,继续生成下一个数字的组合。

9. 回溯

stack.pop();
  • 回溯时移除当前数字,尝试其他可能的组合。

复杂度分析

时间复杂度

  • 组合的数量为 C(9, k),即从 9 个数字中选 k 个数字的组合数。
  • 每次生成一个组合需要 O(k) 的时间。
  • 因此,总时间复杂度为 O(C(9, k) * k)

空间复杂度

  • 需要存储所有组合,空间复杂度为 O(C(9, k) * k)
  • 递归栈的深度为 k,因此额外空间复杂度为 O(k)

总结的知识点

1. 深度优先搜索(DFS)

  • 使用 DFS 遍历所有可能的组合。

2. 剪枝

  • 在 DFS 过程中,通过条件判断跳过无效的搜索路径。

3. 回溯

  • 在 DFS 过程中,使用 stack 记录当前组合,并在回溯时移除最后一个数字。

4. 组合问题

  • 通过限制搜索的起始位置(start 参数),避免生成重复的组合。

整合

class Solution {public List<List<Integer>> combinationSum3(int k, int target) {List<List<Integer>> result = new ArrayList<>(); // 结果列表dfs(1, target, k, new LinkedList<>(), result); // DFSreturn result;}private static void dfs(int start, int target, int k,LinkedList<Integer> stack,List<List<Integer>> result) {if (target == 0 && stack.size() == k) { // 找到一个组合result.add(new ArrayList<>(stack));return;}// 遍历数字 1 到 9for (int i = start; i <= 9; i++) {if (target < i) { // 剪枝continue;}stack.push(i); // 加入当前组合dfs(i + 1, target - i, k, stack, result); // 递归stack.pop(); // 回溯}}
}

总结

通过 DFS 和回溯,高效地找到所有由 k 个不同数字组成的组合,且这些数字的和为 target


http://www.ppmy.cn/embedded/164246.html

相关文章

网易严选DevOps实践:从传统到云原生的演进

在互联网行业的快速变革中&#xff0c;网易严选面临着前所未有的挑战和机遇。为了提升产品研发运营效率&#xff0c;降低创新成本&#xff0c;网易严选积极拥抱DevOps文化&#xff0c;并在其实践过程中积累了宝贵的经验。本文将深入探讨网易严选在DevOps领域的实践之旅&#xf…

哈希:LeetCode49. 字母异位词分组 128.最长连续序列

49. 字母异位词分组 给你一个字符串数组&#xff0c;请你将 字母异位词 组合在一起。可以按任意顺序返回结果列表。 字母异位词 是由重新排列源单词的所有字母得到的一个新单词。 示例 1: 输入: strs ["eat", "tea", "tan", "ate",…

HBase性能优化秘籍:让数据处理飞起来

HBase性能优化秘籍&#xff1a;让数据处理飞起来 数据处理太慢&#xff1f;别担心&#xff0c;这里有解决方案&#xff01; 你是否遇到过这样的情况&#xff1a;随着数据量的不断增加&#xff0c;HBase的查询和写入速度变得越来越慢&#xff1f;别担心&#xff0c;今天我们就…

2.5GE 超千兆SFP光模块型号(常用光模块收发光功率范围)

SFP 2.5GE超千兆光模&#xff0c;参考表格&#xff1a; 型号类型工作波长 (nm)发光功率 (dBm)光功率灵敏度 (dBm)传输距离 (m)SFP-25G-SR多模光纤850-10.0 to -3.0-18.0300 (OM3) / 400 (OM4)SFP-25G-LR单模光纤1310-5.0 to 1.0-24.010,000SFP-25G-ER单模光纤1550-1.0 to 4.0…

JUC并发—8.并发安全集合一

大纲 1.JDK 1.7的HashMap的死循环与数据丢失 2.ConcurrentHashMap的并发安全 3.ConcurrentHashMap的设计介绍 4.ConcurrentHashMap的put操作流程 5.ConcurrentHashMap的Node数组初始化 6.ConcurrentHashMap对Hash冲突的处理 7.ConcurrentHashMap的并发扩容机制 8.Concu…

边缘安全加速(ESA)套餐

为帮助不同规模和需求的企业选择合适的解决方案&#xff0c;边缘安全加速&#xff08;ESA&#xff09;提供了多种套餐。以下是四种主要套餐的介绍&#xff0c;每个套餐都根据企业需求提供不同的功能和服务水平&#xff0c;从基础安全保护到企业级的全面防护与加速。 1. 各版本详…

MTK-Android13-包安装器PackageInstaller 静默安装实现

目的 我们最终是为了搞明白安装的整个流程。一方面通过安卓系统自带的包安装器来了解PMS 安装流程&#xff1b;另一方面熟悉框架层Framework 针对Android apk 安装流程。 前两篇文章分析了PackagerInstaller 安装流程。 Android13-包安装器PackageInstaller-之apk安装跳转 An…

基于LM Arena 的 LLM 基准测试排行榜:DeepSeek-R1 排名第 5

打开 Arena 网站&#xff1a;https://lmarena.ai/&#xff0c;点开 Leaderboard 可以看到上图的排行榜&#xff0c;可以看到 DeepSeek-R1 排名第 5。