題目連結(jié):
題目意譯:
給定一相異整數(shù)之陣列以及一個(gè)目標(biāo)整數(shù) target,回傳可能的組合之?dāng)?shù)量其組合中的數(shù)字總和為 target。
答案保證可以存進(jìn)一個(gè) 32 位元整數(shù)裡。
限制:
1 ≦ nums.length ≦ 200
1 ≦ nums[i] ≦ 1000
nums 中所有元素相異。
1 ≦ target ≦ 1000
進(jìn)階: 如果給定的陣列中允許有負(fù)數(shù)呢?會(huì)如何影響這道問題?我們需要為題目加上什麼限制才能使得題目允許負(fù)數(shù)之存在?
範(fàn)例測(cè)資:
範(fàn)例 1:
輸入: nums = [1,2,3], target = 4
輸出: 7
解釋:
可能的組合方式為:
(1, 1, 1, 1)
(1, 1, 2)
(1, 2, 1)
(1, 3)
(2, 1, 1)
(2, 2)
(3, 1)
注意到不同順序的數(shù)列視為不同組合。
範(fàn)例 2:
輸入: nums = [9], target = 3
輸出: 0
解題思維:
可以看到每種數(shù)字可使用任意次。
觀察範(fàn)例輸入一,nums = [1,2,3]、target = 4,其方法數(shù)分為以下三種:
1 開頭 + (target = 3 之方法)、
2 開頭 + (target = 2 之方法)、
3 開頭 + (target = 1 之方法)、
可以看到這其實(shí)跟走樓梯問題(如
這題)相當(dāng)類似。只是現(xiàn)在可以走的步伐存在了 nums 陣列裡。
因此,我們可以仿照一般的走樓梯問題去計(jì)算 target 的方法數(shù)(等同於在有 nums.length 種步伐時(shí),走到第 target 階有多少種走法)。
不過要注意的是,因?yàn)轭}目提及的是答案可以存入 32 位元整數(shù),而非 32 位元「有號(hào)」整數(shù)。所以對(duì)於 C/C++ 來說需要使用 32 位元無號(hào)整數(shù)來存答案才會(huì)得到正確值。
那麼,如果 nums 裡有負(fù)數(shù)呢?此時(shí)代表著我們可以走回頭路(一直在樓梯上上下下)使得方法數(shù)有機(jī)會(huì)變?yōu)闊o限大。因此,要使得答案為有限值有幾種限制方式:
一:不要有負(fù)數(shù)(廢話);
二:限制方法的「長(zhǎng)度」上限;
三:每種負(fù)數(shù)有使用次數(shù)之限制;
四:所有數(shù)字不管正負(fù)都有使用次數(shù)限制;
此次分享到此為止,如有任何更加簡(jiǎn)潔的想法或是有說明不清楚之地方,也煩請(qǐng)各位大大撥冗討論。