Leetcode 377

int combinationSum4(vector<int>& nums, int target) {
    vector<int> dp(target + 1, 0);
    dp[0] = 1;
    for (int i = 0; i <= target; i++) {
        for (int j = 0; j < nums.size(); j++) {
            if (i < nums[j]) continue;
            dp[i] = (dp[i] >= INT_MAX - dp[i - nums[j]]) ? INT_MAX : dp[i] + dp[i - nums[j]];
        }
    }
    return dp[target];
}

作者:ikaruga
链接:https://leetcode-cn.com/problems/combination-sum-iv/solution/377-by-ikaruga/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

 

如你所见这个代码不是我写的,我只是想说明一下本题的坑。

 

我们的朴素思想是做一个 dp,然而你会发现这道题如果你不用 python,测试用例的结果大小直接起飞。举个例子,

[3,33,333]
999

这个测试用例的最终结果是多少?

1127975497240371557486457

更不要说真实的测试用例不是 999,而是 10000。

 

因此 AC 本题需要注意一下几点:

第一、不要用 dp + dfs,而应该直接填完整个 dp 数组。否则 TLE。

第二、如果某个 dp 槽位的结果可能会大于 INT_MAX,就直接将其设为 INT_MAX。因为题目限制了返回类型为 int,因此一定不会存在结果大于 INT_MAX 的测试用例。

 

附上我的 python 代码:

class Solution:
    def combinationSum4(self, nums: List[int], target: int) -> int:
        m = [0]*(target + 1)
        m[0] = 1
        for i in range(1, target + 1):
            for n in nums:
                if i - n >= 0:
                    m[i] += m[i - n]
        return m[target]

 

posted on 2020-09-11 01:31  Ricochet!  阅读(142)  评论(0编辑  收藏  举报