摘要:通過這一點,我們構成一個遞歸表達式,但是因為單純的遞歸表達式沒有計算中間結果,所以會造成大量重復的計算影響效率,所以這里采用的思路額外的用數組來記錄已經計算過的結果。比如,如果沒有,則需要重復計算的結果。
題目要求
Given an integer array with all positive numbers and no duplicates, find the number of possible combinations that add up to a positive integer target. Example: nums = [1, 2, 3] target = 4 The possible combination ways are: (1, 1, 1, 1) (1, 1, 2) (1, 2, 1) (1, 3) (2, 1, 1) (2, 2) (3, 1) Note that different sequences are counted as different combinations. Therefore the output is 7. Follow up: What if negative numbers are allowed in the given array? How does it change the problem? What limitation we need to add to the question to allow negative numbers?
有一個不包含重復值的正整數數組nums,問從數組中選擇幾個數,其和為target,這樣的數的組合有幾種?
思路一:自頂向下的dp這題本質上需要注意一點,就是我如果需要組成target,那么一定是由nums中的一個值和另一個值的排列組合結果構成的。比如com[4] = com[4-1] + com[4-2] + com[4-1]。通過這一點,我們構成一個遞歸表達式,但是因為單純的遞歸表達式沒有計算中間結果,所以會造成大量重復的計算影響效率,所以這里采用dp的思路額外的用數組來記錄已經計算過的com結果。比如com[3] = com[2] + com[1], com[2] = com[1],如果沒有dp,則需要重復計算com[1]的結果。
public int combinationSum4(int[] nums, int target) { if (nums == null || nums.length < 1) { return 0; } int[] dp = new int[target + 1]; Arrays.fill(dp, -1); dp[0] = 1; return helper(nums, target, dp); } private int helper(int[] nums, int target, int[] dp) { if (dp[target] != -1) { return dp[target]; } int res = 0; for (int i = 0; i < nums.length; i++) { if (target >= nums[i]) { res += helper(nums, target - nums[i], dp); } } dp[target] = res; return res; }思路二:自底向上dp
public int combinationSum4(int[] nums, int target) { Arrays.sort(nums); int[] combinationCount = new int[target+1]; combinationCount[0] = 1; for(int i = 1 ; i<=target ; i++) { for(int j = 0 ; j
更多技術資訊,面試教程和互聯網公司內推,歡迎關注我的微信公眾號!
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/72685.html
摘要:和唯一的不同是組合中不能存在重復的元素,因此,在遞歸時將初始位即可。 Combination Sum I Problem Given a set of candidate numbers (C) and a target number (T), find all unique combinations in C where the candidate numbers sums to T...
摘要:單次選擇最大體積動規經典題目,用數組表示書包空間為的時候能裝的物品最大容量。注意的空間要給,因為我們要求的是第個值,否則會拋出。依然是以背包空間為限制條件,所不同的是取的是價值較大值,而非體積較大值。 Backpack I Problem 單次選擇+最大體積 Given n items with size Ai, an integer m denotes the size of a b...
摘要:此時,若也正好減小為,說明當前集合是正解,加入數組。兩個無法得到正解的情況是在為,而不為時,當然已經無法得到正解,。在不為而卻已經小于等于的情況下,此時仍要加入其它數以令為,而要加入的數都是到的正整數,所以已無法滿足令為的條件,。 Combination Sum I & II: link Combination Sum III Problem Find all possible com...
摘要:題目要求輸入和,找到所有個不同數字的組合,這些組合中數字的和為參考,解答這是一道典型的的題目,通過遞歸的方式記錄嘗試的節點,如果成功則加入結果集,如果失敗則返回上一個嘗試的節點進行下一種嘗試。 題目要求 Find all possible combinations of k numbers that add up to a number n, given that only numbe...
摘要:深度優先搜索復雜度時間空間遞歸棧空間思路因為我們可以任意組合任意多個數,看其和是否是目標數,而且還要返回所有可能的組合,所以我們必須遍歷所有可能性才能求解。這題是非常基本且典型的深度優先搜索并返回路徑的題。本質上是有限深度優先搜索。 Combination Sum I Given a set of candidate numbers (C) and a target number (...
閱讀 1808·2021-11-23 09:51
閱讀 1268·2021-11-18 10:02
閱讀 963·2021-10-25 09:44
閱讀 2099·2019-08-26 18:36
閱讀 1619·2019-08-26 12:17
閱讀 1146·2019-08-26 11:59
閱讀 2746·2019-08-23 15:56
閱讀 3350·2019-08-23 15:05