探索隊列和棧 目標和 dfs深度優先搜索

給定一個非負整數數組,a1, a2, …, an, 和一個目標數,S。現在你有兩個符號 + 和 -。對於數組中的任意一個整數,你都可以從 + 或 -中選擇一個符號添加在前面。
返回可以使最終數組和爲目標數 S 的所有添加符號的方法數。
示例 1:
輸入: nums: [1, 1, 1, 1, 1], S: 3
輸出: 5
解釋:
-1+1+1+1+1 = 3
+1-1+1+1+1 = 3
+1+1-1+1+1 = 3
+1+1+1-1+1 = 3
+1+1+1+1-1 = 3
一共有5種方法讓最終目標和爲3。
注意:
數組非空,且長度不會超過20。
初始的數組的和不會超過1000。
保證返回的最終結果能被32位整數存下。

class Solution {
public:
    int findTargetSumWays(vector<int>& nums, int S) {
		int sum = 0;
		dfs(nums,0,S,0,sum);
		return sum;
    }
     void dfs(vector<int>& nums,int index,int S,long long nowSum,int& sum) {
     //nums是容器,index是容器下標,S是目標值,nowSum是目前的值,sum是有多少種方法,sum一定要加&指向地址,否則自增值不起效
         if(index==nums.size()){//說明已經加到了末尾
             if(nowSum==S){//如果nowsum等於目標值S
                 sum=sum+1;//方法數加1
             }
             return;
         }
         else if(index<nums.size()){
             dfs(nums, index+1,S,nowSum+nums[index],sum);//nowSUM進行加
             dfs(nums, index+1,S,nowSum-nums[index],sum);//nowSum進行減
         }
     }
};
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章