leetcode:494. 目标和
题目
给你一个整数数组 nums
和一个整数 target
。
向数组中的每个整数前添加 '+'
或 '-'
,然后串联起所有整数,可以构造一个 表达式 :
例如,nums = [2, 1]
,可以在 2 之前添加 '+'
,在 1
之前添加 '-'
,然后串联起来得到表达式 "+2-1"
。
返回可以通过上述方法构造的、运算结果等于 target
的不同 表达式 的数目。
示例:
输入:nums = [1,1,1,1,1], target = 3
输出:5
解释:一共有 5 种方法让最终目标和为 3 。
-1 + 1 + 1 + 1 + 1 = 3
+1 - 1 + 1 + 1 + 1 = 3
+1 + 1 - 1 + 1 + 1 = 3
+1 + 1 + 1 - 1 + 1 = 3
+1 + 1 + 1 + 1 - 1 = 3
输入:nums = [1], target = 1
输出:1
解答 & 代码
解法一:递归回溯
class Solution {
private:
int result = 0;
void backTrack(vector<int>& nums, int start, int target)
{
if(start == nums.size())
{
if(target == 0)
result += 1;
return;
}
// 对当前数 nums[target] 取 +
backTrack(nums, start + 1, target - nums[start]);
// 对当前数 nums[target] 取 -
backTrack(nums, start + 1, target + nums[start]);
}
public:
int findTargetSumWays(vector<int>& nums, int target) {
backTrack(nums, 0, target);
return result;
}
};
复杂度分析:设整数数组 nums
长为 N
- 时间复杂度
:N 个数,每个数可以去 + or -,因此状态数一共有
- 空间复杂度 O(N):递归栈深度
执行结果:
执行结果:通过
执行用时:1172 ms, 在所有 C++ 提交中击败了 24.12% 的用户
内存消耗:8.8 MB, 在所有 C++ 提交中击败了 71.69% 的用户