LeetCode 40 组合总和||
本题思路:由于解集中不能包含重复的组合,所以要进行去重的操作。
- 首先要将数组先进行一个排序操作
- 然后在树层进行去重操作!(不懂的可以去看代码随想录讲解视频)
- 利用一个 used 数组来表示,数组中的元素是否已经用过
首先是要找到出口,该题的出口就是,sum > target 的时候就要 return,如果等于的时候,就要保存结果。
然后在树层进行去重
class Solution {List<Integer> path = new ArrayList();List<List<Integer>> res = new ArrayList();int sum = 0;public List<List<Integer>> combinationSum2(int[] candidates, int target) {int[] used = new int[candidates.length];Arrays.sort(candidates);backtracking(candidates,target,sum,0,used);return res;}public void backtracking(int[] candidates, int target, int sum, int startIndex,int[] used){if(sum > target){return;}if(sum == target){res.add(new ArrayList(path));return;}for(int i = startIndex; i < candidates.length; i++){if(i > 0 && candidates[i] == candidates[i-1] && used[i-1] == 0){continue;}path.add(candidates[i]);sum += candidates[i];used[i] = 1;backtracking(candidates,target,sum,i+1,used);sum -= candidates[i];used[i] = 0;path.removeLast();}}
}
LeetCode 39 组合总和
本题思路:和上题一样,但是不用进行去重操作
- 首先找到终止条件,如果 sum > target 就 return,如果 等于 target 就保存路径元素。
class Solution {List<Integer> path = new ArrayList();List<List<Integer>> res = new ArrayList();int sum = 0;public List<List<Integer>> combinationSum(int[] candidates, int target) {backtracking(candidates,target,0,sum);return res;}public void backtracking(int[] candidates,int target,int startIndex,int sum){if(sum > target){return;}if(sum == target){// 将路径元素存起来res.add(new ArrayList(path));return;}for(int i = startIndex; i < candidates.length; i++){path.add(candidates[i]);sum += candidates[i];backtracking(candidates,target,i,sum);sum -= candidates[i];path.removeLast();}}}
LeetCode 131 分割回文串
本题思路:首先找到终止条件,就是 startIndex > s.length(),此时就要开始记录路径的元素。 关于判断 s 是否是 回文串的逻辑,放在 for 循环里面判断,如果是就放进去,不是就不放到 path 中,所以在终止条件记录元素的时候,可以直接记录保存。
class Solution {List<String> path = new ArrayList();List<List<String>> res = new ArrayList();public List<List<String>> partition(String s) {backtracking(s,0);return res;}public void backtracking(String s, int startIndex){if(startIndex >= s.length()){res.add(new ArrayList(path));return;}for(int i = startIndex; i < s.length(); i++){if(judge(s,startIndex,i)){String str = s.substring(startIndex, i + 1);path.add(str);}else{continue;}backtracking(s,i+1);path.removeLast();}}public boolean judge(String s, int start, int end){while(start <= end){if(s.charAt(start) != s.charAt(end)){return false;}start++;end--;}return true;}}