【LeetCode】C# 39、Combination Sum

Given a set of candidate numbers (C) (without duplicates) and a target number (T), find all unique combinations in C where the candidate numbers sums to T.

The same repeated number may be chosen from C unlimited number of times.

Note:
All numbers (including target) will be positive integers.
The solution set must not contain duplicate combinations.
For example, given candidate set [2, 3, 6, 7] and target 7,
A solution set is:
[
[7],
[2, 2, 3]
]

给定数组和目标值,数组中的个别值拼凑求和,把所有符合条件的组合返回。

思路:DP
这里写图片描述

public class Solution {
    public List<List<int>> CombinationSum(int[] candidates, int target) {
        Array.Sort(candidates);
        List<List<int>> result = new List<List<int>>();
        getResult(result, new List<int>(), candidates, target, 0);
        return result;
    }

    private void getResult(List<List<int>> result, List<int> cur, int[] candidates, int target, int start){
        if(target > 0){
            for(int i = start; i < candidates.Length && target >= candidates[i]; i++){
                cur.Add(candidates[i]);
                getResult(result, cur, candidates, target - candidates[i], i);
                cur.RemoveAt(cur.Count() - 1);
            }
        }
        else if(target == 0 ){
            result.Add(new List<int>(cur));
        }
    }
}

思路2:动态规划。
参考自
http://www.cnblogs.com/etcow/archive/2012/07/03/2575443.html
这里写图片描述

public static List<List<int>> CominationSum(int[] candidates, int target)
        {
            Dictionary<int, List<List<int>>> map = new Dictionary<int, List<List<int>>>();
            //Array.Sort(candidates);

            for (int cur_sum = 1; cur_sum <= target; cur_sum++)
            {
                for (int cand_index = 0; cand_index < candidates.Length; cand_index++)
                {
                    if (cur_sum < candidates[cand_index])
                        continue;
                    if (cur_sum == candidates[cand_index])
                    {
                        List<int> templist = new List<int> { candidates[cand_index] };
                        if (map.ContainsKey(cur_sum))
                            map[cur_sum].Add(templist);
                        else
                        {
                            List<List<int>> templistlist = new List<List<int>>();
                            templistlist.Add(templist);
                            map.Add(cur_sum, templistlist);
                        }
                        continue;
                    }

                    int pre_cur_sum = cur_sum - candidates[cand_index];
                    if (!map.ContainsKey(pre_cur_sum))
                        continue;
                    else
                    {
                        int pre_cur_sum_size = map[pre_cur_sum].Count;
                        for (int i = 0; i < pre_cur_sum_size; i++)
                        {
                            if (map[pre_cur_sum][i][map[pre_cur_sum][i].Count - 1] <= candidates[cand_index])
                            {
                                List<int> templist = new List<int>(map[pre_cur_sum][i]);
                                templist.Add(candidates[cand_index]);
                                if (map.ContainsKey(cur_sum))
                                    map[cur_sum].Add(templist);
                                else
                                {
                                    List<List<int>> templistlist = new List<List<int>>();
                                    templistlist.Add(templist);
                                    map.Add(cur_sum, templistlist);
                                }
                            }
                        }
                    }
                }
            }

            return map[target];
        }

这两个思路C#解都能在VS跑出来,但LeetCode都没AC,因为LeetCode不接受返回格式为List<List<int>>只能为IList<IList<int>>,我不知道怎么初始化,烦请知道怎么解决的朋友赐教。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值