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. 目标和的主要内容,如果未能解决你的问题,请参考以下文章