提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
一、力扣39. 组合总和
class Solution {
private List<Integer> path = new ArrayList<>();
private List<List<Integer>> result = new ArrayList<>();
private int count = 0;
public List<List<Integer>> combinationSum(int[] candidates, int target) {
Arrays.sort(candidates);
fun(candidates, target, 0);
return result;
}
public void fun(int[] candidates, int target, int startIndex){
if(count == target){
result.add(new ArrayList<>(path));
return;
}
for(int i = startIndex; i< candidates.length; i++){
if(count + candidates[i] > target){
return;
}
path.add(candidates[i]);
count += candidates[i];
fun(candidates, target, i);
path.remove(path.size()-1);
count -= candidates[i];
}
}
}
二、力扣40. 组合总和 II
class Solution {
private List<Integer> path = new ArrayList<>();
private List<List<Integer>> res = new ArrayList<>();
private boolean[] flag;
private int count = 0;
public List<List<Integer>> combinationSum2(int[] candidates, int target) {
flag = new boolean[candidates.length];
Arrays.fill(flag, false);
Arrays.sort(candidates);
fun(candidates, target, 0);
return res;
}
public void fun(int[] candidates, int target, int startIndex){
if(count == target){
res.add(new ArrayList<>(path));
return ;
}
for(int i = startIndex; i < candidates.length; i++){
if(count + candidates[i] > target){
break;
}
if(i>0 && candidates[i] == candidates[i-1] && !flag[i-1]){
continue;
}
flag[i] = true;
path.add(candidates[i]);
count += candidates[i];
fun(candidates, target, i+1);
flag[i] = false;
path.remove(path.size()-1);
count -= candidates[i];
}
}
}
三、力扣131.分割回文串
class Solution {
private List<String> path = new ArrayList<>();
private List<List<String>> res = new ArrayList<>();
public List<List<String>> partition(String s) {
fun(s, 0);
return res;
}
private void fun(String s, int startIndex){
if(startIndex >= s.length()){
res.add(new ArrayList<>(path));
return ;
}
for(int i = startIndex; i< s.length(); i++){
if(isfun(s, startIndex, i)){
path.add(s.substring(startIndex, i+1));
}else{
continue;
}
fun(s, i+1);
path.remove(path.size()-1);
}
}
private boolean isfun(String s, int begin, int end){
for(int i = begin, j = end; i <= j; i ++, j --){
if(s.charAt(i) != s.charAt(j)){
return false;
}
}
return true;
}
}
881

被折叠的 条评论
为什么被折叠?



