• 博客园logo
  • 会员
  • 众包
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • HarmonyOS
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录
neverlandly
博客园    首页    新随笔    联系   管理    订阅  订阅

Leetcode: Combination Sum IV && Summary: The Key to Solve DP

Given an integer array with all positive numbers and no duplicates, find the number of possible combinations that add up to a positive integer target.

Example:

nums = [1, 2, 3]
target = 4

The possible combination ways are:
(1, 1, 1, 1)
(1, 1, 2)
(1, 2, 1)
(1, 3)
(2, 1, 1)
(2, 2)
(3, 1)

Note that different sequences are counted as different combinations.

Therefore the output is 7.
Follow up:
What if negative numbers are allowed in the given array?
How does it change the problem?
What limitation we need to add to the question to allow negative numbers?

DP 解法: the key to solve DP problem is to think about how to create overlap, how to re-solve subproblems(怎么制造复用)

Bottom up dp:

 1 public class Solution {
 2     public int combinationSum4(int[] nums, int target) {
 3         if (nums==null || nums.length==0) return 0;
 4         Arrays.sort(nums);
 5         int[] dp = new int[target+1];
 6         dp[0] = 1;
 7         for (int i=1; i<=target; i++) {
 8             for (int j=0; j<nums.length && nums[j]<=i; j++) {
 9                 dp[i] += dp[i-nums[j]];
10             }
11         }
12         return dp[target];
13     }
14 }

Better Solution(Bottom-up)不sort也成:

 1 public int combinationSum4(int[] nums, int target) {
 2     int[] comb = new int[target + 1];
 3     comb[0] = 1;
 4     for (int i = 1; i < comb.length; i++) {
 5         for (int j = 0; j < nums.length; j++) {
 6             if (i - nums[j] >= 0) {
 7                 comb[i] += comb[i - nums[j]];
 8             }
 9         }
10     }
11     return comb[target];
12 }

 

 

Follow up:

I think if there are negative numbers in the array, we must add a requirement that each number is only used one time, or either positive number or negative number should be used only one time, otherwise there would be infinite possible combinations.
For example, we are given:
{1, -1}, target = 1,
it's obvious to see as long as we choose n 1s and (n-1) -1s, it always sums up to 1, n can be any value >= 1.

posted @ 2016-11-28 11:40  neverlandly  阅读(329)  评论(0)    收藏  举报
刷新页面返回顶部
博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3