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);
}
}
}