【数据结构】目标和 Target Sum

时间:2021-10-07
本文章向大家介绍【数据结构】目标和 Target Sum,主要包括【数据结构】目标和 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

原文地址:https://www.cnblogs.com/dreamtaker/p/15377355.html