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);
// }
};