首页 > 其他分享 >40. 组合总和 II

40. 组合总和 II

时间:2024-10-20 14:17:52浏览次数:9  
标签:target 递归 组合 combination 40 II candidates 复杂度 总和

目录

一、问题描述

二、解题思路

三、代码

四、复杂度分析


一、问题描述

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

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

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

二、解题思路

  • 排序
    candidates 数组进行排序,便于后续剪枝以及避免重复组合的产生。

  • 回溯: 我们使用递归来探索所有可能的组合。在每次递归时,选择当前数字,并将目标 target 减去当前数字。如果目标 target 减为 0,说明找到了一组解,将其加入结果列表;否则继续递归寻找下一个数字。

    在每一层递归中,为了保证每个数字只使用一次,我们通过维护一个start索引,确保在递归中不会重复选择已经选过的数字。同时,为了防止相同组合出现,我们在递归过程中要跳过重复的数字。

  • 剪枝: 如果当前数字大于目标 target,则无需继续递归,因为数组是排序的,后续数字只会更大。

  • 终止条件

    • target == 0 时,表示找到了一组符合条件的组合,加入结果集。
    • target < 0 时,停止递归。

三、代码

class Solution {
    public List<List<Integer>> combinationSum2(int[] candidates, int target) {
        List<List<Integer>> result = new ArrayList<>();
        Arrays.sort(candidates); // 排序,便于剪枝和去重
        backtrack(candidates, target, 0, new ArrayList<>(), result);
        return result;
    }

    // 回溯函数
    private void backtrack(int[] candidates, int target, int start, List<Integer> combination, List<List<Integer>> result) {
        if (target == 0) {
            result.add(new ArrayList<>(combination)); // 找到符合条件的组合
            return;
        }
        for (int i = start; i < candidates.length; i++) {
            if (i > start && candidates[i] == candidates[i - 1]) { // 跳过重复元素
                continue;
            }
            if (candidates[i] > target) { // 剪枝,如果当前数大于目标值,直接跳过
                break;
            }
            combination.add(candidates[i]); // 选择当前元素
            backtrack(candidates, target - candidates[i], i + 1, combination, result); // 递归
            combination.remove(combination.size() - 1); // 回溯,移除最后一个元素
        }
    }
}

四、复杂度分析

  • 时间复杂度

    • 由于题目要求找到所有符合条件的组合,时间复杂度与组合数量相关。在最坏的情况下,组合数量可能为 O(2^n),其中 n 是 candidates 的长度,具体的时间复杂度取决于 candidatestarget 的值。
  • 空间复杂度

    • 递归深度取决于 target 和数组的元素,因此最坏情况下递归深度为 O(n),再加上存储结果的空间,最终空间复杂度为 O(n + k),其中 k 是结果集的组合数量。

标签:target,递归,组合,combination,40,II,candidates,复杂度,总和
From: https://blog.csdn.net/weixin_61695887/article/details/142990822

相关文章

  • PBOOTCMS网站访问页面提示:您访问的页面不存在,请核对后重试!如何改成自动404跳转页面
    当用户访问PbootCMS网站时,如果请求的页面不存在,系统会显示一个错误页面,提示“您访问的页面不存在,请核对后重试!”。为了提升用户体验,可以将这个错误页面设置为1秒后自动跳转到其他页面,例如首页或指定的404页面。步骤打开错误页面模板文件:进入PbootCMS根目录,找到 core/......
  • 2024-2025-1 20241403《计算机基础与程序设计》第四周学习总结
    学期(如2024-2025-1)学号(如:20241403)《计算机基础与程序设计》第四周学习总结作业信息这个作业属于哪个课程<班级的链接>(如2024-2025-1-计算机基础与程序设计)这个作业要求在哪里<作业要求的链接>(如2024-2025-1计算机基础与程序设计第四周作业)这个作业的目标门电......
  • P5048 [Ynoi2019 模拟赛] Yuno loves sqrt technology III
    Sol蒲公英题意基本相同,但是注意到空间限制62.5MB,显然不能用蒲公英的做法。考虑先把整块的答案算出来,然后把小块的部分补上去,显然大块可以预处理,小块可以直接暴力查询是否越界。代码很简单。Code#include<iostream>#include<iomanip>#include<cstdio>#include<vector>......
  • 用C++实现自己的智能指针:深入探讨内存管理与RAII模式
    解锁Python编程的无限可能:《奇妙的Python》带你漫游代码世界C++中的内存管理一直以来是程序员的一个难点,尤其是在处理动态内存分配时。智能指针(如std::unique_ptr和std::shared_ptr)通过RAII(资源获取即初始化)的设计理念,极大地简化了动态内存的管理,减少了内存泄漏的风险。然......
  • INT 404: Image and Video Processing
    Lab1–INT404:ImageandVideoProcessingStartDate:2024-10-09Deadline:2023-10-2315%ofthefinalmarksLateSubmissionPolicy:5%ofthetotalmarksavailablefortheassessmentshallbedeductedfromtheassessmentmarkforeachworkingdayaf......
  • Java毕设项目案例实战II基于Spring Boot的药店管理系统的设计与实现(开发文档+数据库+
    目录一、前言二、技术介绍三、系统实现四、论文参考五、核心代码六、源码获取全栈码农以及毕业设计实战开发,CSDN平台Java领域新星创作者,专注于大学生项目实战开发、讲解和毕业答疑辅导。获取源码联系方式请查看文末一、前言随着医疗行业的快速发展和人们对健康需求......
  • C++的RAII原则
    C++的RAII原则内容ResourceAcquisitionIsInitialization(RAII)isacoreprogrammingconceptinC++(andotherresource-managedlanguages).Itensuresthatresources,suchasmemory,filehandles,ornetworkconnections,areacquiredandreleasedproperlyb......
  • 科普文:软件架构数据库系列之【MySQL死锁案例分析:间隙锁“Gap Lock”导致的死锁及解决
    概叙科普文:软件架构数据库系列之【详解MySQL死锁】-CSDN博客科普文:软件架构数据库系列之【MySQL死锁案例分析:index_merge导致的死锁及解决方案ERROR1213(40001):Deadlock】-CSDN博客科普文:软件架构数据库系列之【MySQL死锁案例分析:加锁顺序“循环等待”导致的死锁及解......
  • 20222403 2024-2025-1 《网络与系统攻防技术》实验二实验报告
    |1.实验内容1.1实践目标(1)使用netcat获取主机操作Shell,cron启动某项任务(任务自定)(2)使用socat获取主机操作Shell,任务计划启动(3)使用MSFmeterpreter(或其他软件)生成可执行文件,利用ncat或socat传送到主机并运行获取主机Shell(4)使用MSFmeterpreter(或其他软件)生成获取目标......
  • P4050 麻将 题解
    不愧是ZJOI。题意:有\(n\)种麻将牌,每种四张。定义"胡牌"为小鸡胡或普通七小对。给定初始\(13\)张牌,将剩下\(4n-13\)张牌随机排列,问期望摸多少张牌能胡(假设采用最优决策)。\(n\le100\)。先考虑怎么判定是否胡牌。\(cnt[i]\)表示前\(i\)种牌能凑出多少个对子,\(f[i][j]......