C# コード カプリス アルゴリズム トレーニング キャンプ 25 日目 | バックトラッキング アルゴリズム、合計問題、電話番号の組み合わせ

LeetCode216 組み合わせ和Ⅲ

トピック:

合計すると n になり、次の条件を満たす数値の k 個の組み合わせをすべて検索します:
1 から 9 までの数値のみを使用し、
各数値を最大 1 回のみ使用します。
考えられるすべての有効な組み合わせのリストを返します。リストに同じ組み合わせを 2 回含めることはできず、組み合わせは任意の順序で返すことができます。

例 1:
入力: k = 3、n = 7
出力: [[1,2,4]]
説明:
1 + 2 + 4 = 7
他に一致する組み合わせはありません。

例 2:
入力: k = 3、n = 9
出力: [[1,2,6]、[1,3,5]、[2,3,4]]
説明:
1 + 2 + 6 = 9
1 + 3 + 5 = 9
2 + 3 + 4 = 9
他に一致する組み合わせはありません。

例 3:
入力: k = 4、n = 1
出力: []
説明: 有効な組み合わせがありません。
[1,9] の範囲内の 4 つの異なる数値を使用すると、取得できる最小の合計は 1+2+3+4 = 10 になります。10 > 1 であるため、有効な組み合わせはありません。

アイデア:

ここに画像の説明を挿入します

コード:
public class Solution {
    
    
    IList<IList<int>> res = new List<IList<int>>();
    IList<int> list = new List<int>();
    public IList<IList<int>> CombinationSum3(int k, int n)
    {
    
    
        BackTracking(k, n, 1, 0);
        return res;
    }

    public void BackTracking(int k, int targetSum, int startIndex, int sum)
    {
    
    
        //剪枝
        if (sum > targetSum) return;
        if (list.Count == k)
        {
    
    
            if (sum == targetSum)
            {
    
    
                res.Add(new List<int>(list));
            }
            return;
        }
        for (int i = startIndex; i <= 9; i++)
        {
    
    
            sum += i;
            list.Add(i);
            BackTracking(k, targetSum, i + 1, sum);
            //回溯(最关键的一步)
            sum -= i;
            list.RemoveAt(list.Count - 1);
        }
    }
}

LeetCode17 電話番号のアルファベット

トピック:

2 ~ 9 の数字のみを含む文字列を指定すると、それが表すことができるすべての文字の組み合わせを返します。回答は任意の順序で返すことができます。
数字と文字のマッピングを以下に示します (電話のキーと同じ)。1 はどの文字にも対応しないことに注意してください。

例 1:
ここに画像の説明を挿入します

入力: 数字 = "23"
出力: ["ad"、"ae"、"af"、"bd"、"be"、"bf"、"cd"、"ce"、"cf"]

例 2:
入力: 数字 = ""
出力: []

例 3:
入力: 数字 = "2"
出力: ["a", "b", "c"]

コード:
public class Solution {
    
    
    IList<string> res1 = new List<string>();
    public IList<string> LetterCombinations(string digits)
    {
    
    
        Dictionary<char, string> dic = new Dictionary<char, string>();
        if (digits.Length == 0) return res1;
        dic.Add('2', "abc");
        dic.Add('3', "def");
        dic.Add('4', "ghi");
        dic.Add('5', "jkl");
        dic.Add('6', "mno");
        dic.Add('7', "pqrs");
        dic.Add('8', "tuv");
        dic.Add('9', "wxyz");
        BackTracking1(0, "", digits, dic);
        return res1;
    }

    public void BackTracking1(int startIndex, string str, string digits, Dictionary<char,string> dic)
    {
    
    
        if (str.Length == digits.Length)
        {
    
    
            res1.Add(str);
            return;
        }
        string temp = dic[digits[startIndex]];
        for (int i = 0; i < temp.Length; i++)
        {
    
    
            str += temp[i];
            BackTracking1(startIndex + 1, str, digits, dic);
            str = str.Remove(str.Length - 1);
        }
    }
}

おすすめ

転載: blog.csdn.net/weixin_44740741/article/details/130020331