C#LeetCode刷题之#39-组合总和(Combination Sum)

C#LeetCode刷题之#39-组合总和(Combination Sum)

目录

问题

给定一个无重复元素的数组 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合。

candidates 中的数字可以无限制重复被选取。

说明:

  • 所有数字(包括 target)都是正整数。
  • 解集不能包含重复的组合。

输入: candidates = [2,3,6,7], 

target = 7, 

所求解集为: [ [7], [2,2,3] ]

输入: candidates = [2,3,5],

target = 8,

所求解集为: [ [2,2,2,2], [2,3,3], [3,5] ]

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

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

Note:

  • All numbers (including target) will be positive integers.
  • The solution set must not contain duplicate combinations.

Input: candidates = [2,3,6,7], 

target = 7, 

A solution set is: [ [7], [2,2,3] ]

Input: candidates = [2,3,5], 

target = 8, 

A solution set is: [ [2,2,2,2], [2,3,3], [3,5] ]

示例

public class Program {

    public static void Main(string[] args) {
        var candidates = new int[] { 2, 3, 6, 7 };
        var target = 7;

        var res = CombinationSum(candidates, target);
        ShowArray(res);

        Console.ReadKey();
    }

    private static void ShowArray(List<IList<int>> candidates) {
        foreach(var candi in candidates) {
            foreach(var num in candi) {
                Console.Write($"{num} ");
            }
            Console.WriteLine();
        }
        Console.WriteLine();
    }

    public static List<IList<int>> CombinationSum(int[] candidates, int target) {
        var res = new List<IList<int>>();
        var candi = new List<int>();
        Combination(candidates, 0, target, candi, ref res);
        return res;
    }

    public static void Combination(int[] candidates,
                                   int start,
                                   int target,
                                   List<int> candi,
                                   ref List<IList<int>> res) {
        if(target < 0) return;
        if(target == 0) {
            res.Add(candi);
            return;
        }
        for(var i = start; i < candidates.Length; i++) {
            candi.Add(candidates[i]);
            Combination(candidates, i, target - candidates[i], candi.ToList(), ref res);
            candi.RemoveAt(candi.Count - 1);
        }
    }

}

以上给出1种算法实现,以下是这个案例的输出结果:

2 2 3
7

分析

显而易见, 以上算法的时间复杂度为:O(n^2)O(n2) 。

本文由 .Net中文网 原创发布,欢迎大家踊跃转载。

转载请注明本文地址:https://www.byteflying.com/archives/3663

发表评论

登录后才能评论