39. Combination Sum
- 思路
-
java class Solution { // global parameter List> result = new ArrayList(); LinkedList path = new LinkedList(); int sum = 0; public List> combinationSum(int[] candidates, int target) { Arrays.sort(candidates);//为了剪枝要先排序,要不然得全遍历 helper(candidates, target, 0, 0 ); return result; } //return value & pa private void helper (int[] candidates, int target, int sum, int startIndex){ // if(sum > target){ // return; // }这部分如果没排序必须有 if(sum == target){ result.add(new ArrayList(path)); return;// base case/ terminate condition } //for loop traversal 横向遍历 for(int i = startIndex; i < candidates.length; i++){ int num = candidates[i]; //剪枝 pruning if(sum + num > target){ break; } path.add(num); //节点操作 sum += num; helper(candidates, target, sum, i); //recursion path.removeLast();// backtracking sum -= num; } } }
-
40. Combination Sum II
- 思路
- 这题由于数组中可能出现数字重复,有两种方法解决
-
java class Solution { List> result = new ArrayList(); LinkedList path = new LinkedList(); int sum = 0; public List> combinationSum2(int[] candidates, int target) { Arrays.sort(candidates); helper(candidates, target, 0, 0); return result; } private void helper(int[] candidates, int target, int sum, int startIndex){ if(sum == target){ result.add(new ArrayList(path)); return; } for (int i = startIndex; i < candidates.length; i++){ int num = candidates[i]; if (sum + num > target){ break; } //这里是用startIndex来解决重复数字 if(i >startIndex && num == candidates[i-1]){ continue; } sum += num; path.add(num); helper(candidates, target, sum, i + 1); path.removeLast(); sum -= num; } } }
-
java //这个是通过增加一个boolean[]参数,来达到规避同层不能用重复数字的问题的 class Solution { List> result = new ArrayList(); LinkedList path = new LinkedList(); int sum = 0; public List> combinationSum2(int[] candidates, int target) { Arrays.sort(candidates); boolean[] flag = new boolean[candidates.length]; helper(candidates, target, 0, 0, flag); return result; } private void helper(int[] candidates, int target, int sum, int startIndex, boolean[] flag){ if(sum == target){ result.add(new ArrayList(path)); return; } for (int i = startIndex; i < candidates.length; i++){ int num = candidates[i]; if (sum + num > target){ break; } if(i > 0 && num == candidates[i-1] && !flag[i-1]){ continue;//同层重复数字中止条件 } flag[i] = true; sum += num; path.add(num); helper(candidates, target, sum, i + 1, flag); path.removeLast(); flag[i] = false; sum -= num; } } }
131. Palindrome Partitioning
- 思路
-
java class Solution { List> result = new ArrayList(); LinkedList path = new LinkedList(); public List> partition(String s) { helper(s, 0); return result; } private void helper(String s, int startIndex){ if(startIndex >= s.length()){ result.add(new ArrayList(path)); return; } for(int i = startIndex; i < s.length(); i++){ if(isPalindrome(s, startIndex, i)){ String str = s.substring(startIndex, i + 1); path.add(str); }else{ // else 可以不写 continue;//必须continue,不能break,break会排除掉aba形式 } helper(s, i + 1); path.removeLast(); } } private boolean isPalindrome(String s, int start, int end){ for(int i = start, j = end; i < j; i++, j--){ if(s.charAt(i) != s.charAt(j)){ return false; } } return true; } }
-