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

【LeetCode: 40. 组合总和 II + 递归】

在这里插入图片描述

🚀 算法题 🚀

🌲 算法刷题专栏 | 面试必备算法 | 面试高频算法 🍀
🌲 越难的东西,越要努力坚持,因为它具有很高的价值,算法就是这样✨
🌲 作者简介:硕风和炜,CSDN-Java领域优质创作者🏆,保研|国家奖学金|高中学习JAVA|大学完善JAVA开发技术栈|面试刷题|面经八股文|经验分享|好用的网站工具分享💎💎💎
🌲 恭喜你发现一枚宝藏博主,赶快收入囊中吧🌻
🌲 人生如棋,我愿为卒,行动虽慢,可谁曾见我后退一步?🎯🎯

🚀 算法题 🚀

在这里插入图片描述
在这里插入图片描述

🍔 目录

    • 🚩 题目链接
    • ⛲ 题目描述
    • 🌟 求解思路&实现代码&运行结果
      • ⚡ 递归
        • 🥦 求解思路
        • 🥦 实现代码
        • 🥦 运行结果
    • 💬 共勉

🚩 题目链接

  • 40. 组合总和 II

⛲ 题目描述

给定一个候选人编号的集合 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合。

candidates 中的每个数字在每个组合中只能使用 一次 。

注意:解集不能包含重复的组合。

示例 1:

输入: candidates = [10,1,2,7,6,1,5], target = 8,
输出:
[
[1,1,6],
[1,2,5],
[1,7],
[2,6]
]
示例 2:

输入: candidates = [2,5,2,1,2], target = 5,
输出:
[
[1,2,2],
[5]
]

提示:

1 <= candidates.length <= 100
1 <= candidates[i] <= 50
1 <= target <= 30

🌟 求解思路&实现代码&运行结果


⚡ 递归

🥦 求解思路
  1. 题目要求从给定的候选数组 candidates 中找出所有和为 target 的组合。与“组合总和 I”不同的是,candidates 中的每个数字只能使用一次,且解集中不能包含重复的组合。

  2. 具体求解算法如下所示:

    • 排序:首先对候选数组进行排序,方便后续去重和剪枝。

    • 回溯算法:使用回溯算法遍历所有可能的组合。

    • 终止条件:如果 target == 0,说明当前组合满足条件,将其加入结果集。如果 index 超出数组范围或 target < 0,说明当前组合不满足条件,直接返回。

    • 去重:为了避免重复组合,如果当前元素与前一个元素相同且前一个元素未被使用,则跳过当前元素。

    • 递归搜索:从当前索引开始遍历候选数组,尝试将每个元素加入组合,并递归搜索剩余部分。

    • 回溯:在递归返回后,移除当前元素,恢复状态,继续尝试其他可能性。

  3. 有了基本的思路,接下来我们就来通过代码来实现一下。

🥦 实现代码
class Solution {

    private List<List<Integer>> ans = new ArrayList<>();

    private List<Integer> list = new ArrayList<>();

    public List<List<Integer>> combinationSum2(int[] candidates, int target) {
        if (candidates == null || target <= 0 || candidates.length <= 0)
            return ans;
        Arrays.sort(candidates);
        int n = candidates.length;
        boolean[] flag = new boolean[n];
        dfs(0, candidates, target, flag);
        return ans;
    }

    public void dfs(int index, int[] candidates, int target, boolean[] flag) {
        if (index > candidates.length || target < 0) {
            return;
        }
        if (target == 0) {
            ans.add(new ArrayList<>(list));
            return;
        }
        for (int i = index; i < candidates.length; i++) {
            if (flag[i] || (i > 0 && candidates[i] == candidates[i - 1] && !flag[i - 1])) {
                continue;
            }
            list.add(candidates[i]);
            flag[i] = true;
            dfs(i + 1, candidates, target - candidates[i], flag);
            list.remove(list.size() - 1);
            flag[i] = false;
        }
    }
}
🥦 运行结果

在这里插入图片描述


💬 共勉

最后,我想和大家分享一句一直激励我的座右铭,希望可以与大家共勉!

在这里插入图片描述

在这里插入图片描述


http://www.kler.cn/a/520724.html

相关文章:

  • 三星手机人脸识别解锁需要点击一下电源键,能够不用点击直接解锁吗
  • Leetcode45:跳跃游戏 II
  • 2024年度总结——理想的风,吹进现实
  • AIP-132 标准方法:List
  • < OS 有关 > 阿里云:轻量应用服务器 的使用 :轻量化 阿里云 vpm 主机
  • 网易Android开发面试题200道及参考答案 (下)
  • 练习题 - Django 4.x Email 邮件使用示例和配置方法
  • 组件中的emit
  • HTML-新浪新闻-实现标题-样式1
  • 80,【4】BUUCTF WEB [SUCTF 2018]MultiSQL
  • 跨平台填录信息,使用办公自动化机器人
  • kotlin内联函数——let,run,apply,also,with的区别
  • 《DeepSeek R1:开源大模型的破局者》
  • Nginx入门学习二
  • 【elasticsearch】reindex 断点续传
  • dm8在Linux环境安装精简步骤说明(2024年12月更新版dm8)
  • 【2024年华为OD机试】 (A卷,100分)- 模拟商场优惠打折(JavaScriptJava PythonC/C++)
  • 使用scikit-learn中的KNN包实现对鸢尾花数据集的预测
  • 被占用的电脑文件推沟里
  • 从零开始学 HTML:构建网页的基本框架与技巧
  • 【C++】类和对象(五)
  • RBAC 权限控制 - 前端
  • GESP2024年3月认证C++六级( 第三部分编程题(2)好斗的牛)
  • python基础语法(3) -------- 学习笔记分享
  • 99.17 金融难点通俗解释:归母净利润
  • Day42:列表的组合