题干
原题网址:
https://leetcode.com/problems/target-sum/description/
题干解析
给你一组数据,和一个目标数据S,对那组数据进行处理(对数组中的每一个数,可以选择保持原值(即前面加上‘+’号),或者选它的相反数(即前面加上‘-’号)),要求那组数据最终的和等于S。
知识点
动态规划
难度
中等
解题思路
这道题可以用动态规划的思路来解。对于每个数,要么保持原值,要么取反,那么我们两种操作都尝试:如果保持原值的话,就将目标S减去本数原值,看看后面的数进行操作后能得到S减去本数原值的有多少种可能;如果取反的话,就将目标S加上本数,看看后面的数进行操作后能得到S加上本数原值的有多少种可能。再将上述两个加起来,即得到所有可能的值。判断终止的条件是,当已经遍历到剩下最后一个数,看看这个数或者这个数的相反数是否等于现在需要的目标值(已经不是原来的S,而是经过前面一系列的操作之后得到的新的目标)。只要想清楚这个过程,代码写起来非常简单。具体代码如下:
代码
class Solution {
public:
int findTargetSumWays(vector<int>& nums, int S) {
return help(nums, S, 0);
}
int help(vector<int>& nums, int S, int first) {
if (first == nums.size()) {
return 0;
}
if (first == nums.size() - 1) {
if (S == 0 && nums[first] == 0) {
return 2;
}
if (S == nums[first] || (-1) * S == nums[first]) {
return 1;
}
return 0;
}
return help(nums, S - nums[first], first + 1) + help(nums, S + nums[first], first + 1);
}
};