【数据结构】目标和 Target Sum
目标和 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


浙公网安备 33010602011771号