目录
39 组合总和
40 组合总和II
131分割回文串
39 组合总和
class Solution {List<List<Integer>>res = new ArrayList<>();List<Integer>newList = new LinkedList<>();public List<List<Integer>> combinationSum(int[] candidates, int target) {dfs(candidates,target,0);return res;}private void dfs(int candidates[],int target,int cnt){if(target < 0)return;if(target == 0){res.add(new ArrayList(newList));return;}for(int i = cnt;i < candidates.length;i++){target -= candidates[i];newList.add(candidates[i]);dfs(candidates,target,i);target += candidates[i];newList.remove(newList.size() - 1);}}
}
时间复杂度O(n×)n为数组长度
空间复杂度O(target)最差情况下为targrt
40 组合总和II
class Solution {List<List<Integer>>res = new ArrayList<>();List<Integer>path = new LinkedList<>();boolean st[];public List<List<Integer>> combinationSum2(int[] candidates, int target) {Arrays.sort(candidates);st = new boolean[candidates.length];Arrays.fill(st,false);dfs(candidates,target,0);return res;}private void dfs(int candidates[],int target,int cnt){if(target < 0)return;if(target == 0){res.add(new LinkedList(path));return;}for(int i = cnt;i < candidates.length;i++){if(i > 0 && candidates[i] == candidates[i - 1] && !st[i - 1])continue;target -= candidates[i];path.add(candidates[i]);st[i] = true;dfs(candidates,target,i + 1);path.remove(path.size() - 1);st[i] = false;target += candidates[i];}}
}
时间复杂度O(n×)n为数组长度
空间复杂度O(n)最差情况下为n
131分割回文串