和39. Combination Sum 不同的是,377 可以把不同排列的解认为是不同解,例如 [1,1,2] 和 [2,1,1] 是不同解,并且只需要求出解的个数。
例如
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)
返回解的个数7即可。
写成如下解法结果正确,但会TLE,并且在递归中返回解的个数,每次 return 1 就好,不能是count++
class Solution { public int combinationSum4(int[] nums, int target) { return dfs( nums,target, 0); } private int dfs( int[] nums, int target, int sum){ int count = 0; if(sum > target) return 0; if(sum == target) { //count++; return 1; } for(int i=0; i<nums.length; i++){ sum+= nums[i]; count += dfs( nums,target, sum); sum-= nums[i]; } return count; } }
这里拿backtraing 每次把sum += nums[i] 再去掉 上一次的 sum -= num[i]
但不是一个好的写法,好的写法是定义 remain ,而不是sum, code 如下,但依然会TLE
class Solution { public int combinationSum4(int[] nums, int target) { return dfs( nums,target); } private int dfs( int[] nums, int remain){ int count = 0; if(remain < 0) return 0; if(remain == 0) { return 1; } for(int i=0; i<nums.length; i++){ count += dfs(nums, remain - nums[i]); } return count; } }