LeetCode 494. Target Sum

使用遞歸方法
class Solution {
public:
    int findTargetSumWays(vector<int>& nums, int S) {
        int res=0;
        find(nums,S,0,res);
        return res;
    }
    void find(vector<int>& nums, int S, int start, int& res){
        if(start >= nums.size()){
            if(!S) res++;
            return;
        }
        find(nums,S-nums[start],start+1,res);
        find(nums,S+nums[start],start+1,res);
    }
};


使用dp 方法 推到公式,sum(A)-sum(B)=S, 2*sum(A)=S+sum(A)+sum(B) = S+ SUM


class Solution {
public:
  int findTargetSumWays(vector<int>& nums, int S) {
    int sum = accumulate(nums.begin(), nums.end(), 0);
    if (sum < S || ((S + sum) & 0x1 == 1)) { // 判斷奇數
        return 0;
    }
    int target = (S + sum) >> 1;
    vector<int> dp(target + 1, 0);
    dp[0] = 1;
    for (auto num : nums) {
        for (int i = target; i >= num; --i) {
            dp[i] += dp[i - num];
        }
    }
    return dp[target];
  }
};


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章