文章目录
目标和 Target Sum
一个整数组nums
和一个整数target
,向nums
中的每个数字前添加 +或-,形成的表达式,计算结果等于target
,计算所有满足的表达式的数目。
in:nums = [1,1,1,1,1], target = 3
out:5
思路
使用DFS
,每一次状态扩展有2个选择加
,减
。影响结果的是dfs
的参数第i个数,和余下的target
。直到dfs
递归到最后的数组index,此时target
等于0 说明找到一个方案,否则就返回0.
可以在dfs
过程中采用记忆化处理【HashMap
】,减少分支重复计。
HashMap<PII,Integer> map = new HashMap<>();
public class PII {
public int i;
public int tar;
PII(int x,int t){
this.i = x;
this.tar = t;
}
@Override
public boolean equals(Object o) {
PII pii = (PII) o;
return i == pii.i &&
tar == pii.tar;
}
@Override
public int hashCode() {
return Objects.hash(i, tar);
}
}
public int dfs(int i,int target,int[] nums){
if(i==nums.length){
return target==0?1:0;
}
PII pii= new PII(i,target);
if(map.containsKey(pii)){
return map.get(pii);
}
int ans =0;
ans += dfs(i+1,target-nums[i],nums);
ans += dfs(i+1,target+nums[i],nums);
map.put(pii,ans);
return ans;
}
public int findTargetSumWays(int[] nums, int target) {
return dfs(0,target,nums);
}
Tag
DFS