1. 程式人生 > >377. Combination Sum IV--back tracking +map 優化---ing

377. Combination Sum IV--back tracking +map 優化---ing

和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;
    }
}