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.pswp.cn/bicheng/15773.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/15773.shtml
英文地址,請注明出處:http://en.pswp.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("請給電影《肖申克的救贖》打…