给定一个由不同整数构成的数组 nums 和一个整数 target ,请你从 nums 找出总和是 target 的组合的个数。解集中可以重复使用 nums 中的元素。且解集中数字顺序不同视为不同的组合。
数据范围: 数组长度满足 ,数组中的数满足 ,
[1,2,3],4
7
所有可能的组合为: (1, 1, 1, 1) (1, 1, 2) (1, 2, 1) (1, 3) (2, 1, 1) (2, 2) (3, 1)
[9],10
0
[9],18
1
[[9,9]]
import java.util.*; public class Solution { /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * * * @param nums int整型一维数组 * @param target int整型 * @return int整型 */ int count = 0; public int combination (int[] nums, int target) { // write code here dfs(nums, target); return count; } private void dfs(int[] nums, int rest) { if(rest < 0){ return; // 凑过头了,本次组合无效 } if(rest == 0){ // 凑足目标值了就添加答案 count++; }else{ // 否则遍历此时选所有数的可能,继续递归选下一个数 for(int i = 0; i < nums.length; i++){ dfs(nums, rest - nums[i]); } } } }
# # 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 # # # @param nums int整型一维数组 # @param target int整型 # @return int整型 # class Solution: def combination(self , nums: List[int], target: int) -> int: # write code here res_s = set() self.traverse(nums, 0, target, [], res_s) return len(res_s) def traverse(self, nums, now_sum, target, tmp_arr, res_s): if now_sum == target: res_s.add(tuple(tmp_arr)) return if now_sum > target: return for i in range(len(nums)): tmp_arr.append(nums[i]) self.traverse(nums, now_sum + nums[i], target, tmp_arr, res_s) tmp_arr.pop()
class Solution { private: vector<vector<int>> result; vector<int> path; public: int combination(vector<int>& nums, int target) { // write code here result.clear(); path.clear(); sort(nums.begin(),nums.end()); backtracking(nums,target,0,0); return result.size(); } void backtracking(vector<int>& candidates,int target,int sum,int startIndex){ if(sum==target){ result.push_back(path); return; } for(int i=startIndex;i<candidates.size()&&sum+candidates[i]<=target;i++){ sum+=candidates[i]; path.push_back(candidates[i]); backtracking(candidates,target,sum,0); sum-=candidates[i]; path.pop_back(); } } };
function combination( nums , target ) { // write code here const res = [] const fn = (i, path) => { path.push(i) let sum = path.reduce((s, val) => s += val, 0) if (sum > target) { return } if (sum == target) { res.push([...path]) return } for (let j = 0; j < nums.length; j++) { fn(nums[j], path) // 回溯 path.pop() } } for (let i = 0; i < nums.length; i++) { fn(nums[i], []) } return res.length }
public int combination (int[] nums, int target) { // write code here ArrayList<ArrayList<Integer>> res = new ArrayList<>(); ArrayList<Integer> list = new ArrayList<>(); Arrays.sort(nums); dfs(res, list, nums, target); return res.size(); } public void dfs(ArrayList<ArrayList<Integer>> res, ArrayList<Integer> list, int[] nums, int target) { if(target == 0){ res.add(new ArrayList<Integer>(list)); } for (int i = 0; i < nums.length; i++) { if (nums[i] > target) { return; } list.add(i); dfs(res, list, nums, target - nums[i]); list.remove(list.size() - 1); } }
package main import _"fmt" /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * * * @param nums int整型一维数组 * @param target int整型 * @return int整型 */ func combination( nums []int , target int ) int { ans:=0 var dfs func(int) dfs=func(sum int){ if sum>=target{ if sum==target{ ans++ } return } for i:=0;i<len(nums);i++{ sum+=nums[i] dfs(sum) sum-=nums[i] } } dfs(0) return ans }
#include <vector> class Solution { private: int result=0; public: /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * * * @param nums int整型vector * @param target int整型 * @return int整型 */ void backtracking(vector<int>& nums, int target, int sum) { if(sum==target) { result++; return; } for(int i=0;i<nums.size()&&sum+nums[i]<=target;i++) { sum+=nums[i]; backtracking(nums, target, sum); sum-=nums[i]; } } int combination(vector<int>& nums, int target) { // write code here sort(nums.begin(), nums.end()); backtracking(nums, target, 0); return result; } };
function combination( nums , target ) { let res = 0; let path = []; nums.sort(); backTracking(nums, target, 0); return res; function backTracking(nums, target, sum){ if(sum === target){ res++; return; } if(sum > target){ return; } for(let i = 0; i < nums.length; i++){ sum += nums[i]; path.push(nums[i]); backTracking(nums, target, sum); sum -= nums[i]; path.pop(); } } }
public int combination (int[] nums, int target) { backTrack(nums, target); return cnt; } public int sum = 0, cnt = 0; public void backTrack(int[] nums, int target) { if (sum > target) return; if (sum == target) { cnt++; return; } for (int i = 0; i < nums.length; i++) { sum += nums[i]; backTrack(nums, target); sum -= nums[i]; } }