1. Recursive Branching (+ and -)
Intuition
Recursively evaluate assigning + and - to each number, counting evaluations that reach target.
Algorithm
- Define
solve(idx, currentSum). - If
idx == n, return 1 ifcurrentSum == targetelse 0. - Return
solve(idx + 1, currentSum + nums[idx]) + solve(idx + 1, currentSum - nums[idx]).
#include <iostream>#include <vector> using namespace std; class Solution { int solve(int idx, int currentSum, const vector<int>& nums, int target) { if (idx == nums.size()) { return (currentSum == target) ? 1 : 0; } return solve(idx + 1, currentSum + nums[idx], nums, target) + solve(idx + 1, currentSum - nums[idx], nums, target); }public: int findTargetSumWays(vector<int>& nums, int target) { return solve(0, 0, nums, target); }}; int main() { Solution sol; vector<int> nums = {1, 1, 1, 1, 1}; cout << "Ways: " << sol.findTargetSumWays(nums, 3) << endl; return 0;}Time & Space Complexity
- Time complexity:
O(2^n) - Space complexity:
O(n) call stack