dp 走一波。
```
/**
* @
param {number[]} candidates
* @
param {number} target
* @
return {number[][]}
*/
var combinationSum = function(candidates, target) {
// 思路就是 dp
// 比如 target 2 的解是子问题 1 的解+子问题 1 的解,和 2 自己
// target 3 的解可以是子问题 1 的解+子问题 1 的解+子问题 1 的解 / 子问题 1 的解+子问题 2 的解和 3 自己
// target 4 的解就是 3 的解+1+自己。
// 变一下这个思路,7 的解应该是自己(如果有) + 6 - 1 中的组合。
// 还可继续优化。
candidates = candidates.sort((a, b) => {
return a - b
})
let _find = {}
candidates.map((item) => {
_find[item] = 1
})
let dp = [
]
if (candidates[0] === 1) {
dp.push({
num: 1,
sub: [[1]]
})
} else {
dp.push({
num: 1,
sub: []
})
}
for (let i=2; i <= target; i++) {
let sub = []
let old = {}
for (let j = i-1; j > 0; j--) {
if (dp[j-1].sub.lenght !== 0 && _find[i-j]) {
for (let c of dp[j-1].sub) {
let temp = [...c, i-j].sort((a, b) => {
return a - b
})
if (!old[temp.join('')]) {
sub.push(temp)
old[temp.join('')] = 1
continue
}
}
}
}
if (_find[i]) {
sub.push([i])
}
dp.push({
num: i,
sub: sub
})
}
// console.log(dp[dp.length - 1].sub)
return dp[dp.length - 1].sub
};
```
https://leetcode-cn.com/problems/combination-sum/执行用时:
156 ms
, 在所有 JavaScript 提交中击败了
11.81%
的用户
内存消耗:
46.9 MB
, 在所有 JavaScript 提交中击败了
5.04%
的用户