LeetCode 494. 目标和

Posted 数据结构和算法

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了LeetCode 494. 目标和相关的知识,希望对你有一定的参考价值。

截止到目前我已经写了 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;
}

以上是关于LeetCode 494. 目标和的主要内容,如果未能解决你的问题,请参考以下文章

LeetCode 494. 目标和

LeetCode 494. 目标和

Leetcode刷题Python494. 目标和

LeetCode494. 目标和 / 474. 一和零 / 203. 移除链表元素 / 第 244 场力扣周赛

题目地址(494. 目标和)

494. 目标和