題目來源:力扣(LeetCode)
鏈接:https://leetcode-cn.com/problems/target-sum
給定一個非負整數數組,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(int[] nums, int S) {
int[] ans = {0};
dfs(nums,0,S,ans);
return ans[0];
}
private void dfs(int[] nums,int index,int target,int[] ans){
if(index >= nums.length){
if(target == 0){
ans[0] += 1;
}
return;
}
dfs(nums,index+1,target+nums[index],ans);
dfs(nums,index+1,target-nums[index],ans);
}
}