39. 组合总和 - 力扣(LeetCode)

基础知识要求:

Java: 方法、集合、泛型、Arrays工具类、for循环、if判断

Python: 方法、列表、for循环、if判断

题目: 

给你一个 无重复元素 的整数数组 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

思路解析:

这个问题是一个典型的回溯算法问题,可以使用深度优先搜索(DFS)来解决。在DFS的过程中,我们需要维护一个当前路径(即当前组合)以及当前的和。

具体思路如下:

  1. 定义一个辅助函数dfs(candidates, target, start, path, res),其中candidates是候选数组,target是目标和,start是当前搜索的起始位置(保证无重复解),path是当前的组合,res是存储所有解的列表。

  2. dfs函数中,首先检查当前和是否等于目标和,如果等于,则将当前组合加入结果列表中。

  3. 然后遍历候选数组,从start位置开始(允许重复选择),对于每个元素,如果加上当前元素的值不超过目标和,则将该元素加入当前组合,并递归调用dfs函数,传入下一个位置作为新的起始位置。

  4. 在递归调用返回后,需要将当前元素从组合中移除(回溯),以便尝试其他可能的组合。

Java代码示例:

import java.util.ArrayList;  
import java.util.Arrays;  
import java.util.List;  public class Solution {  public List<List<Integer>> combinationSum(int[] candidates, int target) {  List<List<Integer>> res = new ArrayList<>();  Arrays.sort(candidates); // 排序使得后续可以选择更小的数字  dfs(candidates, target, 0, new ArrayList<>(), res);  return res;  }  private void dfs(int[] candidates, int target, int start, List<Integer> path, List<List<Integer>> res) {  if (target == 0) {  res.add(new ArrayList<>(path)); // 添加当前组合到结果中  return;  }  for (int i = start; i < candidates.length; i++) {  if (candidates[i] > target) {  break; // 如果当前数字已经大于目标和,则不需要继续搜索  }  path.add(candidates[i]); // 选择当前数字  dfs(candidates, target - candidates[i], i, path, res); // 注意起始位置仍然是i,因为允许重复选择  path.remove(path.size() - 1); // 回溯,移除当前数字  }  }  public static void main(String[] args) {  Solution solution = new Solution();  int[] candidates = {2, 3, 6, 7};  int target = 7;  List<List<Integer>> combinations = solution.combinationSum(candidates, target);  for (List<Integer> combination : combinations) {  System.out.println(combination);  }  }  
}
以上代码将输出:
[2, 2, 3]  
[7]

Python代码示例:

from typing import List  def combinationSum(candidates: List[int], target: int) -> List[List[int]]:  res = []  candidates.sort()  # 排序使得后续可以选择更小的数字  def dfs(start, path, remaining):  if remaining == 0:  res.append(path[:])  # 添加当前组合到结果中  return  for i in range(start, len(candidates)):  if candidates[i] > remaining:  break  # 如果当前数字已经大于剩余和,则不需要继续搜索  path.append(candidates[i])  # 选择当前数字  dfs(i, path, remaining - candidates[i])  # 注意起始位置仍然是i,因为允许重复选择  path.pop()  # 回溯,移除当前数字  dfs(0, [], target)  return res  # 示例  
candidates = [2, 3, 6, 7]  
target = 7  
print(combinationSum(candidates, target))以上代码将输出:
[2, 2, 3]  
[7]

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

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

相关文章

Spring框架学习笔记(五):JdbcTemplate 和 声明式事务

基本介绍&#xff1a;通过 Spring 框架可以配置数据源&#xff0c;从而完成对数据表的操作。JdbcTemplate 是 Spring 提供的访问数据库的技术。将 JDBC 的常用操作封装为模板方法 1 JdbcTemplate 使用前需进行如下配置 1.1 在maven项目的pom文件加入以下依赖 <dependencies…

Java面试进阶指南:高级知识点问答精粹(二)

Java 面试问题及答案 1. 什么是Java内存模型&#xff08;JMM&#xff09;&#xff1f;它在并发编程中扮演什么角色&#xff1f; 答案&#xff1a; Java内存模型&#xff08;JMM&#xff09;是一个抽象的模型&#xff0c;它定义了Java程序中各种变量&#xff08;线程共享变量&…

labelme的使用

创建虚拟环境 听说是要用这个3.6版本的python环境 conda create --namelabelme python3.6激活虚拟环境 activate labelme下载labelme pip install labelme #安装labelme组件启动labelme 在你打开文件的时候推荐还是自己先建立一个label.txt 把自己要分的类别放进去 label.…

Python中的深拷贝与浅拷贝:深入解析与实用指南

Python中的深拷贝与浅拷贝&#xff1a;深入解析与实用指南 一、引言 在Python编程中&#xff0c;我们经常需要复制对象&#xff0c;但有时候仅仅复制对象的引用是不够的&#xff0c;我们需要的是对象的真实副本。此时&#xff0c;我们就需要考虑使用深拷贝或浅拷贝。深拷贝和…

GPT-2添加PAD token

GPT-2和GPT-3模型&#xff08;包括其他类似系列&#xff09;通常没有内置的PAD token&#xff0c;因为它们主要用于生成任务&#xff0c;而这些任务通常不需要填充。然而&#xff0c;在一些特定任务&#xff08;如批量处理或序列对齐&#xff09;中&#xff0c;添加PAD token是…

翻译《The Old New Thing》- What‘s the deal with the EM_SETHILITE message?

Whats the deal with the EM_SETHILITE message? - The Old New Thing (microsoft.com)https://devblogs.microsoft.com/oldnewthing/20071025-00/?p24693 Raymond Chen 2007年10月25日 简要 文章讨论了EM_SETHILITE和EM_GETHILITE消息在文档中显示为“未实现”的原因。这些…

前端 JS 经典:Web 性能指标

什么是性能指标&#xff1a;Web Performance Metrics 翻译成 Web 性能指标&#xff0c;一般和时间有关系&#xff0c;在短时间内做更多有意义的事情。 一个站点表现得好与不好&#xff0c;标准在于用户体验&#xff0c;而用户体验好不好&#xff0c;有一套 RAIL 模型来衡量。这…

大专学历java能找到工作吗

就低学历就业的情况&#xff0c;大专学历的职业上限基本上是中小公司的开发小组长&#xff0c;中专或同等学历的职业上限一般是软件小作坊的项目经理。当下大专学历能进大公司的可能性不能说没&#xff0c;但相比前几年&#xff0c;少了太多。有稳定业务渠道的软件公司&#xf…

Vue.js功能实现博客

Vue.js功能实现博客 一、前言 Vue.js 是一款构建用户界面的渐进式框架。今天我们将通过一个简单的示例来展示如何使用 Vue.js 创建一个简单的计数器功能&#xff0c;并在此过程中解释每个步骤。 二、环境准备 在开始之前&#xff0c;请确保你的开发环境中已经安装了 Node.j…

音视频学习规划

文章目录 概述闲聊点 小结 概述 最近在学习音视频&#xff0c;觉得还是要先写个提纲&#xff0c;给自己制定下学习路线及目标。先写下我的个人流程及思路。 ffmpeg的命令ffmpeg api播放器流媒体RTMP&#xff0c;HLS 闲聊点 先说下学习命令行吧&#xff0c;学习命令行是为了…

GitHub的原理及应用详解(六)

本系列文章简介&#xff1a; GitHub是一个基于Git版本控制系统的代码托管平台&#xff0c;为开发者提供了一个方便的协作和版本管理的工具。它广泛应用于软件开发项目中&#xff0c;包括但不限于代码托管、协作开发、版本控制、错误追踪、持续集成等方面。 GitHub的原理可以简单…

Spring Cloud 项目在网关聚合 Swagger 文档

文章目录 Spring Cloud 项目在网关聚合 Swagger 文档各个微服务的改动改动一&#xff1a;新增依赖改动二&#xff1a;新增配置类关键项说明 Gateway 的改动改动一&#xff1a;新增依赖改动二&#xff1a;新增配置类和处理类改动三&#xff1a;改动配置文件 Spring Cloud 项目在…

一千题,No.0026(Ternary String)

描述 You are given a string s such that each its character is either 1, 2, or 3. You have to choose the shortest contiguous substring of s such that it contains each of these three characters at least once. A contiguous substring of string s is a string …

Python3 笔记:IDLE的几个基本设置

1、设置字体&#xff1a; Options > Configure IDLE > Fonts 2、设置文字颜色&#xff08;设置高亮&#xff09;&#xff1a; Options > Configure IDLE > Highlights 3、设置背景颜色&#xff1a; Options > Configure IDLE > Highlights 4、设置窗口&a…

各位数字和-第13届蓝桥杯选拔赛Python真题精选

[导读]&#xff1a;超平老师的Scratch蓝桥杯真题解读系列在推出之后&#xff0c;受到了广大老师和家长的好评&#xff0c;非常感谢各位的认可和厚爱。作为回馈&#xff0c;超平老师计划推出《Python蓝桥杯真题解析100讲》&#xff0c;这是解读系列的第72讲。 各位数字和&#…

MongoDB(介绍,安装,操作,Springboot整合MonggoDB)

目录 MongoDB 1 MongoDB介绍 MongoDB简介 MongoDB的特点 MongoDB使用场景 小结 2 MongoDB安装 安装MongoDB 连接MongoDB MongoDB逻辑结构 MongoDB数据类型 小结 3 MongoDB操作 操作库和集合 操作文档-增删改 操作文档-查询 MongoDB索引 小结 4 SpringBoot整合…

c# sqlite使用

安装包 使用 const string strconn "Data Sourcedata.db"; using (SQLiteConnection conn new SQLiteConnection(strconn)) {conn.Open();var cmd conn.CreateCommand();cmd.CommandText "select 1";var obj cmd.ExecuteScalar();MessageBox.Show(ob…

ES 查询踩坑-全字段匹配

需求&#xff1a;name字段需要全匹配查询 name的映射 普通的must查询 GET power_engin/_search {"from": 0,"size": 10,"query": {"bool": {"must": [{"term": {"name": {"value": "尼…

刷题之路径总和Ⅲ(leetcode)

路径总和Ⅲ 这题和和《为K的数组》思路一致&#xff0c;也是用前缀表。 代码调试过&#xff0c;所以还加一部分用前序遍历数组和中序遍历数组构造二叉树的代码。 #include<vector> #include<unordered_map> #include<iostream> using namespace std; //Def…

python从入门到精通01

一、程序员计算器 number int(input("请输入一个数字&#xff1a;")) print("二进制",bin(number)) print("八进制",oct(number)) print("十六进制",hex(number))二、给电影打分 score int(input("请给电影《肖申克的救赎》打…