39.组合总和
题目:39. 组合总和 - 力扣(LeetCode)
题解:代码随想录 (programmercarl.com)
不同要求下的组合,可以进行一下总结
solution
public class Solution {
public List<IList<int>> results = new List<IList<int>>();
public IList<IList<int>> CombinationSum(int[] candidates, int target) {
List<int> result = new List<int>();
combineTraversal(candidates, 0, result, 0, target);
return results;
}
public void combineTraversal(int[] candidates, int start, List<int> result, int sum, int target)
{
if(sum > target) return;
if(sum == target)
{
results.Add(new List<int>(result));
return;
}
for(int i = start; i < candidates.Length; i ++)
{
sum += candidates[i];
result.Add(candidates[i]);
combineTraversal(candidates, i, result, sum, target);
sum -= candidates[i];
result.RemoveAt(result.Count - 1);
}
}
}
summary
40.组合总和Ⅱ
题目:40. 组合总和 II - 力扣(LeetCode)
题解:代码随想录 (programmercarl.com)
需要一个去重的操作,同一层相同元素不重复取
solution
public class Solution {
public List<IList<int>> results = new List<IList<int>>();
public IList<IList<int>> CombinationSum2(int[] candidates, int target) {
List<int> result = new List<int>();
Array.Sort(candidates);
combineTraversal(candidates, 0, target, result, 0);
return results;
}
public void combineTraversal(int[] nums, int start, int target, List<int> result, int sum)
{
if(sum == target)
{
results.Add(new List<int>(result));
return;
}
if(sum > target) return;
if(start >= nums.Length) return;
for(int i = start; i < nums.Length; i ++)
{
if(i > start && nums[i] == nums[i - 1]) continue;
result.Add(nums[i]);
sum += nums[i];
combineTraversal(nums, i + 1, target, result, sum);
sum -= nums[i];
result.RemoveAt(result.Count - 1);
}
}
}
summary
错误:
1、去重判断
错误判断
if(i > start && nums[i] == nums[i - 1]) continue;
2、终止条件
注意终止条件的顺序,错误顺序如下
if(start >= nums.Length) return;
if(sum == target)
{
results.Add(new List<int>(result));
return;
}
if(sum > target) return;
当遍历到数组最后一个元素时,进入下一轮递归,先判定结果是否有效,再判定是否溢出数组
131.分割回文串
题目:131. 分割回文串 - 力扣(LeetCode)
题解:代码随想录 (programmercarl.com)
重点是判断回文
solution
public class Solution {
public List<IList<string>> results = new List<IList<string>>();
public IList<IList<string>> Partition(string s) {
StringBuilder sb = new StringBuilder(s);
List<string> result = new List<string>();
partitionTraversal(sb, 0, result);
return results;
}
public void partitionTraversal(StringBuilder sb, int start, List<string> result)
{
if(start >= sb.Length)
{
results.Add(new List<string>(result));
return;
}
StringBuilder subsb = new StringBuilder();
for(int i = start; i < sb.Length; i ++)
{
subsb.Append(sb[i]);
if(isPalindromic(subsb))
{
result.Add(subsb.ToString());
partitionTraversal(sb, i + 1, result);
result.RemoveAt(result.Count - 1);
}
}
}
public bool isPalindromic(StringBuilder sb)
{
int left = 0;
int right = sb.Length - 1;
while (left <= right)
{
if(sb[left] != sb[right]) return false;
left ++;
right --;
}
return true;
}
}
summary
key:
就是组合问题的一种转换,每一层选第i个元素就是生成从起始位置到i的字串