java组合总和2(力扣Leetcode40)

news2024/11/30 18:30:38

组合总和 II

力扣原题链接

问题描述

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

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

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

示例

示例 1:

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

[
  [1,1,6],
  [1,2,5],
  [1,7],
  [2,6]
]![请添加图片描述](https://img-blog.csdnimg.cn/direct/d78f91f8af2f4df2968d937666d1e8d5.jpeg)

示例 2:

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

[
  [1,2,2],
  [5]
]

解题思路

这个问题与前面的组合总和问题类似,但是每个数字在每个组合中只能使用一次。为了避免重复,我们需要在递归搜索的过程中进行剪枝,避免选取相同的数字。

  1. 排序数组: 首先对候选人编号的集合 candidates 进行排序,以便后续剪枝操作。
  2. 回溯搜索: 定义回溯函数 backtrack,其参数包括当前处理的索引 start、当前的目标数 target、当前的数字和 sum、当前的组合路径 path 和记录数字是否使用过的数组 use
  3. 结束条件: 如果当前数字和等于目标数,将当前组合路径加入结果列表,并返回。
  4. 选择列表: 获取当前可选的数字集合。
  5. 遍历选择: 遍历当前可选的数字集合,对每个数字进行递归搜索。
  6. 剪枝操作: 在递归搜索的过程中,如果当前数字等于上一个数字且上一个数字未被使用过,则跳过当前数字,避免选取重复的组合。
  7. 做出选择: 将当前数字加入路径,并将当前数字标记为已使用。
  8. 递归进入下一层: 递归调用回溯函数,传入新的索引 i + 1、新的目标数 target - candidates[i]、新的数字和 sum + candidates[i]、新的组合路径 path 和更新后的记录数组 use
  9. 撤销选择: 回溯到上一层时,将当前选择的数字从路径中删除,并将当前数字的使用状态标记为未使用。

请添加图片描述

Java解题

写法一
import java.util.*;

class Solution {
    List<List<Integer>> res = new ArrayList<>();
    
    public List<List<Integer>> combinationSum2(int[] candidates, int target) {
        List<Integer> path = new ArrayList<>();
        boolean[] use = new boolean[candidates.length];
        Arrays.fill(use, false);
        Arrays.sort(candidates); // 排序数组
        backtrack(candidates, target, 0, 0, path, use);
        return res;
    }
    
    public void backtrack(int[] candidates, int target, int start, int sum, List<Integer> path, boolean[] use) {
        if (sum == target) { // 结束条件
            res.add(new ArrayList<>(path));
            return;
        }
        for (int i = start; i < candidates.length; i++) {
            if (sum > target) break; // 剪枝
            if (i > 0 && candidates[i] == candidates[i - 1] && !use[i - 1]) {
                continue; // 剪枝
            }
            path.add(candidates[i]); // 做出选择
            use[i] = true;
            backtrack(candidates, target, i + 1, sum + candidates[i], path, use); // 递归进入下一层
            use[i] = false; // 撤销选择
            path.remove(path.size() - 1);
        }
    }
}
写法二
class Solution {
    List<List<Integer>> combinations = new ArrayList<>();

    public List<List<Integer>> combinationSum2(int[] candidates, int target) {
        Arrays.sort(candidates); // 排序数组
        backtrack(candidates, target, 0, new ArrayList<>());
        return combinations;
    }

    private void backtrack(int[] candidates, int target, int start, List<Integer> path) {
        if (target == 0) {
            combinations.add(new ArrayList<>(path));
            return;
        }
        for (int i = start; i < candidates.length; i++) {
            // 剪枝:如果当前数字等于上一个数字且当前索引不等于起始索引,则跳过当前数字
            if (i > start && candidates[i] == candidates[i - 1]) {
                continue;
            }
            if (target - candidates[i] < 0) {
                // 剪枝:如果当前数字大于目标数,则跳过,因为后续数字只会更大
                continue;
            }
            // 做出选择
            path.add(candidates[i]);
            // 递归进入下一层
            backtrack(candidates, target - candidates[i], i + 1, path);
            // 撤销选择
            path.remove(path.size() - 1);
        }
    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1555720.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【倪琴神品品鉴】全新倪诗韵神品级古琴

倪琴朱砂神品仲尼&#xff0c;仅此放漏一张&#xff1b;龙池侧签海门倪诗韵制&#xff0c;雁足上方刻“雷音琴坊”方章&#xff0c;凤沼下方有随形章“神品”二字&#xff1b;老木材纹理竖直&#xff0c;共振良好&#xff0c;是难得的佳器&#xff1b;附带倪老师亲笔签名收藏证…

【机器学习之---数学】随机游走

every blog every motto: You can do more than you think. https://blog.csdn.net/weixin_39190382?typeblog 0. 前言 随机游走 1. 概念 1.1 例1 在你的饮食俱乐部度过了一个富有成效的晚上后&#xff0c;你在不太清醒的状态下离开了。因此&#xff0c;你会醉醺醺地在展…

JUC:wait/notify用法并写一个简单消息队列(生产者消费者问题)

文章目录 wait/notifyapiwait vs sleep手写消息队列 wait/notify 这块比较简单&#xff0c;就不在把所有例子都写上了。 要注意区分waitSet和EntryList中的线程&#xff0c;一个获得了锁但是wait释放了锁进入等待notify唤醒状态&#xff0c;一个是正在等待获得锁。 不过相同点…

算法之并查集

并查集&#xff08;Union-find Data Structure&#xff09;是一种树型的数据结构。它的特点是由子结点找到父亲结点&#xff0c;用于处理一些不交集&#xff08;Disjoint Sets&#xff09;的合并及查询问题。 Find&#xff1a;确定元素属于哪一个子集。它可以被用来确定两个元…

wps斜线表头并分别打字教程

wps斜线表头怎么做并分别打字&#xff1a; 1、首先选中我们想要设置的表头。 2、接着右键选中它&#xff0c;点击“设置单元格格式” 3、然后点击上方“边框”选项卡。 4、随后选择图示的斜线&#xff0c;点击“确定” 5、设置完成后&#xff0c;我们只要在其中打字就可以在斜…

vue-v-for遍历index与id

一.遍历列表key的作用&#xff08;index作为key&#xff09; 虚拟DOM上有key,是虚拟的&#xff0c;但是真实DOM上没有&#xff0c;key是Vue内部的 当使用index作为key的时候&#xff0c;Vue会根据初识数据生成一个初始的虚DOM&#xff0c; 然后在页面上映射出真实DOM 如果向数据…

vue 窗口内容滚动到底部

onMounted(() > {scrollToBottom() }) // 滚动到底部方法 const scrollToBottom () > {// 获取聊天窗口容器let chatRoom: any document.querySelector(".chat-content");// 滚动到容器底部chatRoom.scrollTop chatRoom.scrollHeight; } 效果 聊天窗口代码…

HashMap关键源码带读

文章目录 目录 文章目录 前言 1 . 成员变量 灵魂五问 第一问: 默认初始化容量为啥是16? 第二问: 最大容量为什么必须是2的幂? 第三问: 链表转红黑树的阈值为什么是8? 第四问: 红黑树转链表的阈值为什么是6? 第五问: 默认加载因子为什么是0.75? 2. 成员方法 eq…

Discuz采集发布插件

Discuz&#xff08;简称DZ&#xff09;是一款知名的开源论坛系统&#xff0c;广泛应用于各类网站社区。对于许多站长来说&#xff0c;保持论坛内容的更新是一项挑战&#xff0c;特别是在内容量庞大的情况下。为了解决这个问题&#xff0c;有一类特殊的插件是用于在Discuz论坛中…

《QT实用小工具·四》屏幕拾色器

1、概述 源码放在文章末尾 该项目实现了屏幕拾色器的功能&#xff0c;可以根据鼠标指定的位置识别当前位置的颜色 项目功能包含&#xff1a; 鼠标按下实时采集鼠标处的颜色。 实时显示颜色值。 支持16进制格式和rgb格式。 实时显示预览颜色。 根据背景色自动计算合适的前景色…

国内好用的chatGPT和AI绘图工具

分享一个比较好用的AI 分享一个比较好用的AI&#xff0c;只是需要开通会员&#xff0c;目前官网的价格是&#xff1a;298&#xff0c;开通之后可以使用chatgpt4、AI绘画、图片融合等等&#xff01;不开通的话是可以免费使用15次的&#xff0c;下面是一些介绍图片&#xff01;链…

安全团队需要重点演练的四大威胁

文章目录 前言一、勒索软件攻击二、第三方风险三、内部威胁四、分布式拒绝服务攻击(DDoS)前言 桌面演练(推演)是一种重要的安全演习形式,参演人员利用演练方案、流程图、计算机模拟、视频会议等辅助手段,针对事先假定的演练情景,讨论和推演应急决策及现场处置,从而促使相…

点点数据K参数加密逆向分析(RPC方案跟加密算法还原)

文章目录 1. 写在前面2. 接口分析3. 断点分析4. RPC调用5. 算法还原 【&#x1f3e0;作者主页】&#xff1a;吴秋霖 【&#x1f4bc;作者介绍】&#xff1a;擅长爬虫与JS加密逆向分析&#xff01;Python领域优质创作者、CSDN博客专家、阿里云博客专家、华为云享专家。一路走来长…

蓝桥杯物联网竞赛_STM32L071_13_定时器

CubeMx配置LPTIM: counts internal clock events 计数内部时钟事件 prescaler 预分频器 updata end of period 更新期末 kil5配置&#xff1a; 中断回调函数完善一下&#xff1a; void HAL_LPTIM_AutoReloadMatchCallback(LPTIM_HandleTypeDef *hlptim){if(cnt ! 10) cnt…

用Python实现办公自动化(自动化处理Excel工作簿)

自动化处理Excel工作簿 &#xff08;一&#xff09;批量生产产品出货清单 以“出货统计表”为例&#xff0c; 需求&#xff1a;将出货记录按照出货日期分类整理成多张出货清单 “出货统计表数据案例” “产品出货清单模板” 1.提取出货统计表的数据 “Python程序代码” # 使用…

计算机毕业设计Python+Spark知识图谱高考志愿推荐系统 高考数据分析 高考可视化 高考大数据 大数据毕业设计 机器学习 深度学习 人工智能

学院&#xff08;全称&#xff09;&#xff1a; 专业&#xff08;全称&#xff09;&#xff1a; 姓名 学号 年级 班级 设计&#xff08;论文&#xff09; 题目 基于Spark的高考志愿推荐系统设计与实现 指导教师姓名 职称 拟…

机器学习之聚类算法、随机森林

文章目录 随机森林决策树基础特征值问题&#xff1f; 聚类算法 随机森林 决策树 基础 概念&#xff1a;从根节点一步步走到叶子节点&#xff08;决策&#xff09;&#xff1b; 组成&#xff1a;根节点第一个选择的节点&#xff1b;叶子节点最终的决策结果&#xff1b;非叶子…

分文件编程——Makefile

1.分文件编程 1.1源文件&#xff1a; .c结尾的文件 包含main函数的.c 包含子函数的.c 1.2头文件&#xff1a; .h结尾的文件 文件包含 头文件、宏定义、typedef、结构体、共用体、枚举、函数声明… 调用时用#include"xx.h" #include< >与#include " &q…

关系数据库理论

函数依赖: 关系数据库的规范化理论是数据库逻辑设计的工具。 关系模式由五部分组成&#xff0c;是一个五元组&#xff1a; R(U, D, DOM, F)  关系名 R 是符号化的元组语义  U 为一组属性  D 为属性组 U 中的属性所来自的域  DOM 为属性到域的映射  F 为属…

JUC/多线程原理(三)

一、Monitor 原理 二、synchronized 原理 (一)、基础 synchronized 即使内部抛出异常也会释放锁 (二)、轻量级锁 轻量级锁的使用场景&#xff1a;如果一个对象虽然有多线程要加锁&#xff0c;但加锁的时间是错开的&#xff08;也就是 没有竞争 &#xff09;&#xff0c;那么…