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

力扣 leetcode 40. 组合总和 II

时间:2022-12-09 00:23:16浏览次数:60  
标签:力扣 target int res 元素 40 II vector candidates

问题描述

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

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

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

提示:

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

示例

示例 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]
]

解题思路

基本思路参照力扣 leetcode 39. 组合总和,这里添加的限制是数组中每个元素只能使用一次。因此,我们要避免两种重复:一是重复使用同一个数组元素;二是上一轮遍历时使用的元素与这一轮遍历时使用的元素的值相同。

在之前代码的基础上,我们稍作修改,用一个变量 pre 来记录上一轮遍历时所用的数组元素的值,避免重复。

class Solution {
public:

    void pushItem(vector<int>& candidates, vector<vector<int>>& res, int target, vector<int>& r, int n, int idx){
        if(!target){ // 保存结果
            vector<int> tmp(n);
            for(int i = 0; i < n; i++){
                tmp[i] = r[i];
            }
            res.push_back(tmp);
            return;
        }
        int pre = -1;
        for(int i = idx; i < candidates.size(); i++){
            if(pre == candidates[i]){ // 如果此次遍历时,元素与上一轮相同,那么就是重复的,应该跳过
                continue;
            }
            if(candidates[i] <= target){
                if(n < r.size()){
                    r[n] = candidates[i];
                }
                else{
                    r.emplace_back(candidates[i]);
                }
                pushItem(candidates, res, target - candidates[i], r, n + 1, i + 1);
                pre = candidates[i];
            }
            else{
                break;
            }
        }
    }

    vector<vector<int>> combinationSum2(vector<int>& candidates, int target) {
        sort(candidates.begin(), candidates.end());
        vector<int> r;
        vector<vector<int>> res;
        pushItem(candidates, res, target, r, 0, 0);
        return res;
    }
};

标签:力扣,target,int,res,元素,40,II,vector,candidates
From: https://www.cnblogs.com/greatestchen/p/16967803.html

相关文章

  • 力扣 leetcode 39. 组合总和
    问题描述给你一个无重复元素的整数数组candidates和一个目标整数target,找出candidates中可以使数字和为目标数target的所有不同组合,并以列表形式返回。你可......
  • UCOS-III笔记
    1.单片机程序分类:轮询程序,前后台程序,多任务系统程序2.多任务系统伪代码1intflag1=0;2intflag2=0;3intflag3=0;45intmain(void)6{7/*硬件相关初......
  • 代码随想录算法训练营Day17|110. 平衡二叉树、257. 二叉树的所有路径、404. 左叶子之
    代码随想录算法训练营Day17|110.平衡二叉树、257.二叉树的所有路径、404.左叶子之和110.平衡二叉树110.平衡二叉树本题要比较左右子树的高度,首先明确高度和深度的......
  • 遭遇HBKernel32.sys,aliimz.sys,System.exe,koauolte.exe,cho22.tmp等2
    遭遇HBKernel32.sys,aliimz.sys,System.exe,koauolte.exe,cho22.tmp等2 (续1) 因为时间的关系,不能对病毒样本文件做测试,这里把部分文件信息发上来。 文件说明符:C:/WIN......
  • 遭遇HBKernel32.sys,aliimz.sys,System.exe,koauolte.exe,cho22.tmp等1
    遭遇HBKernel32.sys,aliimz.sys,System.exe,koauolte.exe,cho22.tmp等1endurer2008-11-03第1版一位朋友的说他的电脑登录后自动注销,请偶帮忙检修。先尝试安全模式,故障依旧......
  • 1200V CoolSiC模块IMBG120R140M1H SICFET N-CH 18A
    IMBG120R140M1H模块SICFETN-CH1.2KV18ATO263(IMBG120R140M1HXTMA1)说明:1200VCoolSiC模块是碳化硅(SiC)MOSFET模块,具有较高的效率和系统灵活性。这些模块采用近阈值......
  • stm32f407VE6 点亮一个流水灯完整程序
    include"stm32f4xx.h"#include"delay.h"intmain(){//***-必须初始化延时函数-***delay_init(168);//初始化延时函数//第一步:首先配置......
  • 力扣14 寻找字符串数组中最长公共前缀
    力扣14寻找字符串数组中最长公共前缀题目:编写一个函数来查找字符串数组中的最长公共前缀。如果不存在公共前缀,返回空字符串""。示例1:输入:strs=["flower","flow",......
  • 力扣 501. 二叉搜索树中的众数
    501.二叉搜索树中的众数给你一个含重复值的二叉搜索树(BST)的根节点 root ,找出并返回BST中的所有 众数(即,出现频率最高的元素)。如果树中有不止一个众数,可以按 ......
  • 力扣 230. 二叉搜索树中第K小的元素
    230.二叉搜索树中第K小的元素给定一个二叉搜索树的根节点 root ,和一个整数 k ,请你设计一个算法查找其中第 k 个最小元素(从1开始计数)。示例1:输入:root=......