当前位置 博文首页 > 数据结构和算法:LeetCode 494. 目标和

    数据结构和算法:LeetCode 494. 目标和

    作者:[db:作者] 时间:2021-09-09 13:32

    截止到目前我已经写了 500多道算法题,其中部分已经整理成了pdf文档,目前总共有1000多页(并且还会不断的增加),大家可以免费下载
    下载链接:https://pan.baidu.com/s/1hjwK0ZeRxYGB8lIkbKuQgQ
    提取码:6666

    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

    在这里插入图片描述

    //不同表达式的数目
    int count = 0;
    
    public int findTargetSumWays(int[] nums, int target) {
        dfs(nums, target, 0, 0);
        return count;
    }
    
    //从根节点开始往下累加,到叶子节点的时候如果累加值等于target,
    //说明找到了一条符合条件的表达式
    private void dfs(int[] nums, int target, int sum, int index) {
        //判断从根节点到当前叶子节点这条路径是否走完了
        if (index == nums.length) {
            //如果当前累加值等于target,说明找到了一条符号条件的表达式
            if (target == sum)
                count++;
            return;
        }
        //左子树数负数,要减去
        dfs(nums, target, sum - nums[index], index + 1);
        //右子树是正数,要加上
        dfs(nums, target, sum + nums[index], index + 1);
    }
    

    这题我们还可以修改一下,上面计算的时候是从根节点到叶子节点的累加,其实我们还可以从根节点到叶子节点往下减,根节点默认值是target,到叶子节点计算完的时候如果值为0,说明找到了一个满足条件的表达式,原理都差不多,来看下代码

    //不同表达式的数目
    int count = 0;
    
    public int findTargetSumWays(int[] nums, int target) {
        dfs(nums, target, 0);
        return count;
    }
    
    //从更节点开始往下减
    private void dfs(int[] nums, int target, int index) {
        //判断当前路径是否走完了
        if (index == nums.length) {
            //如果走完了,减到最后等于0,说明找到了一条符号条件的表达式
            if (target == 0)
                count++;
            return;
        }
        dfs(nums, target - nums[index], index + 1);
        dfs(nums, target + nums[index], index + 1);
    }
    

    或者还可以这样写,直接通过dfs返回

    public int findTargetSumWays(int[] nums, int target) {
        return dfs(nums, target, 0);
    }
    
    private int dfs(int[] nums, int target, int index) {
        if (index == nums.length) {
            return target == 0 ? 1 : 0;
        }
        int res = 0;
        res += dfs(nums, target - nums[index], index + 1);
        res += dfs(nums, target + nums[index], index + 1);
        return res;
    }
    
    cs