目標和——遞迴的實踐

物隨心轉發表於2020-12-17

一、題目

給定一個非負整數陣列,a1, a2, ..., an, 和一個目標數,S。現在你有兩個符號 + 和 -。對於陣列中的任意一個整數,你都可以從 + 或 -中選擇一個符號新增在前面。

返回可以使最終陣列和為目標數 S 的所有新增符號的方法數。

二、思路

我們可以使用遞迴,列舉出所有可能的情況。具體地,當我們處理到第 i 個數時,我們可以將它新增 + 或 -,遞迴地搜尋這兩種情況。當我們處理完所有的 N 個數時,我們計算出所有數的和,並判斷是否等於 S。

class Solution {

public:
	int count = 0;
	int findTargetSumWays(vector<int> nums, int S) {
		calculate(nums, 0, 0, S);
		return count;
	}
	void calculate(vector<int> nums, int i, int sum, int S) {
		if (i == nums.size()) {
			if (sum == S)
				count++;
		}
		else {
			calculate(nums, i + 1, sum + nums[i], S);
			calculate(nums, i + 1, sum - nums[i], S);
		}
	}
};

參考:

https://leetcode-cn.com/problems/target-sum/solution/mu-biao-he-by-leetcode/

 

 

相關文章