首页 > 其他分享 >leet code 39. 组合总和

leet code 39. 组合总和

时间:2023-11-13 19:05:56浏览次数:32  
标签:leet code target idx 示例 int 39 candidates local

39. 组合总和

题目描述

给你一个 无重复元素 的整数数组 candidates

和一个目标整数 target

找出 candidates 中可以使数字和为目标数 target 的所有不同组合

并以列表形式返回。

你可以按 任意顺序 返回这些组合。

candidates 中的 同一个 数字可以 无限制重复被选取

如果至少一个数字的被选数量不同,则两种组合是不同的。

对于给定的输入,保证和为 target 的不同组合数少于 150 个。

示例 1:

输入:candidates = [2,3,6,7], target = 7

输出:[[2,2,3],[7]]

解释:

2 和 3 可以形成一组候选,2 + 2 + 3 = 7 。
注意 2 可以使用多次。 
7 也是一个候选, 7 = 7 。 仅有这两种组合。

示例 2:

输入: candidates = [2,3,5], target = 8

输出: [[2,2,2,2],[2,3,3],[3,5]]

示例 3:

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

提示:
● 1 <= candidates.length <= 30
● 2 <= candidates[i] <= 40
● candidates 的所有元素 互不相同
● 1 <= target <= 40

题目解析

  • 首先明确是排列问题,还是子集问题
  • 很显然本题是 子集 问题
  • 那么有——对于 candidates 数组中的每一个元素,我们有两个决策
  • 选择当前元素
  • 不选择当前元素
  • 以示例1为例,衍生出的决策树简略图如下
  • 又因candidates中的元素都是不重复的,那么当选择结果符合题意时,必然不会重复

show code

class Solution {

    private List<List<Integer>> ans;

    private int[] candidates;

    public List<List<Integer>> combinationSum(int[] candidates, int target) {
        // 初始化结果集
        ans = new ArrayList<>();
        // 赋值全局变量
        this.candidates = candidates;
        // 回溯搜索
        dfs(new ArrayList<>(), target, 0);
        return ans;
    }

    private void dfs(List<Integer> local, int target, int idx){
        if(idx == candidates.length) {
            // 数组遍历完了
            return;
        }
        if(target == 0) {
            ans.add(new ArrayList<>(local));
            return;
        }

        // 不选择当前元素
        dfs(local, target, idx + 1);

        // 选择当前元素
        if(target - candidates[idx] >= 0) {
            local.add(candidates[idx]);
            // 可重复选择,idx不变
            dfs(local, target -= candidates[idx], idx);
            // 移除当前选择
            local.remove(local.size() - 1);
        }
    }

}

标签:leet,code,target,idx,示例,int,39,candidates,local
From: https://blog.51cto.com/u_16079703/8348722

相关文章

  • SP2139题解
    思路这题数据范围小,暴力就可以了。首先我们用map来统计每个人的下标,用\(bk_{i,j}\)表示第\(i\)个人第\(j\)题是否知道答案。对于每次合作交流,暴力修改就可以了,先统计出两个人的下标,假设一个为\(x\),另一个为\(y\)。然后,如果\(bk_{x,i}\)和\(bk_{y,i}\)中(\(1\lei......
  • macOs Catalina 10.15.7安装xcode
    iMac新装了系统(Catalina10.15.7)之后,安装git提示缺少xcode试了以下方法,都没有成功:1、执行 xcode-select--install,提示:requestedforcommandlinedevelopertools2、通过appstore下载xcode,提示:不能将Xcode安装在macOs上,因为需要macOsv13.5或更高版本 查询了网上的方法......
  • VSCode ESLint规则警告屏蔽方法
    举例:要屏蔽“Missingtrailingcomma”或“comma-dangle”警告,你可以使用ESLint的配置选项来设置规则。下面是一些方法,你可以根据自己的需求选择其中一种(这里只是举例,其他警告处理方法相同)方法1:在代码中添加注释来禁用规则在你希望屏蔽警告的代码行的上方添加如下注释://esli......
  • VSCode ESLint规则警告屏蔽方法
    举例:要屏蔽“Missingtrailingcomma”或“comma-dangle”警告,你可以使用ESLint的配置选项来设置规则。下面是一些方法,你可以根据自己的需求选择其中一种(这里只是举例,其他警告处理方法相同)方法1:在代码中添加注释来禁用规则在你希望屏蔽警告的代码行的上方添加如下注释://eslint-d......
  • Toyota Programming Contest 2023#7(AtCoder Beginner Contest 328)
    ToyotaProgrammingContest2023#7(AtCoderBeginnerContest328)A.NotTooHard题意:将给定的数列\(a\)中数值小于\(x\)的数累加。解题思路:模拟。代码:#include<bits/stdc++.h>usingnamespacestd;usingll=longlong;voidsolve(){ intn,x; cin>>n>>x;......
  • 申报软件著作权时,用vscode编码器统计代码行数(转载)
    原文地址https://blog.csdn.net/michiko98/article/details/133743417在一些特殊情况中我们需要计算代码的行数,这时我们就可以借助vscode的VS CodeCounter插件进行统计。第一步:选择VS Code Counter进行安装。(安装完毕有条件的可以重启编码器)。第二步:快捷键ctrl+shift+p进......
  • 编程最佳外挂:批量数据分析与可视化,CodeGeeX工具箱一键完成
    ChatGLM3代模型的CodeInterpreter能力,本周已经在VSCode里的CodeGeeX插件产品中,以开发者工具箱的产品形态上线。下图以VSCode插件为例:在CodeGeeX的侧边栏,和智能问答AskCodeGeeX并列出现的工具箱标签,用户登录后就可以直接打开使用。CodeInterpreter曾被称为ChatGPT最强外挂。现......
  • 从HumanEval到CoderEval: 你的代码生成模型真的work吗?
    本文分享自华为云社区《从HumanEval到CoderEval:你的代码生成模型真的work吗?》,作者:华为云软件分析Lab。本文主要介绍了一个名为CoderEval的代码生成大模型评估基准,并对三个代码生成模型(CodeGen、PanGu-Coder和ChatGPT)在该基准上的表现进行了评估和比较。研究人员从真实的开源项......
  • ros1 catkin_make 'cv_bridge' not found
    在Ubuntu18.04中进行catkin_make构建代码失败,终端提示Project'cv_bridge'specifies'/usr/include/opencv'asanincludedir,whichisnotfound.等报错信息A:配置文件中的opencv路径与系统实际路径不相符。需使用sudo修改配置文件(路径为/opt/ros/melodic/share/cv_bridge/......
  • String.fromCharCode 函数如何在 html 输入字段中用于移动键盘
    String.fromCharCode函数用于将Unicode编码转换为对应的字符。在HTML输入字段中,您可以使用JavaScript和String.fromCharCode函数来移动键盘。以下是一个简单的示例:首先,创建一个HTML文件,包含一个输入框和一个按钮:<!DOCTYPEhtml><htmllang="en"><head><metacharse......