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的字串