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% 的用户
