Target Sum

1.解析

 題目大意,對於序列的每個元素,如果賦予正負兩種狀態,求解序列和等於S的所有情況。

2.分析

主要參考Grandyang的思路,利用帶有記憶搜索的DFS。對於每個元素無非就是取"+"或"-",如果當前元素取"+",即意味着目標S要減去當前元素,如果取"-",目標S加上當前元素。利用數組保存當前目標和與對應的情況個數,數組下標,代表遍歷的當前位置。終止條件爲:如果遍歷的位置位於序列的最後一個位置,判斷當前目標S是否爲0,如果爲0,說明滿足條件,返回1;反之返回0。還是比較難理解的,建議還是直接用最直接的方法解就行。

class Solution {
public:
    int findTargetSumWays(vector<int>& nums, int S) {
        vector<unordered_map<int, int>> res(nums.size());
        return DFS(nums, S, 0, res);
    }
    
    int DFS(vector<int>& nums, long long sum, int pos, vector<unordered_map<int, int>>& res){
        if (pos == nums.size()) return sum == 0;
        if (res[pos].count(sum)) return res[pos][sum];
        
        int cnt1 = DFS(nums, sum-nums[pos], pos + 1, res);
        int cnt2 = DFS(nums, sum+nums[pos], pos + 1, res);
        return res[pos][sum] = cnt1 + cnt2;
    }
//     int findTargetSumWays(vector<int>& nums, int S) {
//         int res = 0;
//         DFS(nums, S, 0, res);
//         return res;
//     }
    
//     void DFS(vector<int>& nums, long long S, int pos, int& res){
//         if (pos >= nums.size()){
//             if (S == 0) res++;
//             return;
//         }
        
//         DFS(nums, S-nums[pos], pos + 1, res);
//         DFS(nums, S+nums[pos], pos + 1, res);
//     }
};

[1]https://www.cnblogs.com/grandyang/p/6395843.html

發佈了155 篇原創文章 · 獲贊 2 · 訪問量 2356
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章