254. Factor Combinations
class Solution { public List<List<Integer>> getFactors(int n) { List<List<Integer>> res = new ArrayList<>(); //corner case if(n < 4) return res; dfs(n, 2, res, new ArrayList<Integer>()); return res; } private void dfs(int n, int index, List<List<Integer>> res, List<Integer> subset){ if(n == 1){ if(subset.size() > 1){ res.add(new ArrayList<Integer>(subset)); } return; } //拆解 for(int i = index; i <= n; i++){ if(i > n / i) break; if(n % i == 0){ subset.add(i); dfs(n / i, i, res, subset); subset.remove(subset.size() - 1); } } subset.add(n); dfs(1, n, res, subset); subset.remove(subset.size() - 1); } }
47. Permutations II
有重复元素: gren tea
nums[i] == nums[i - 1] && !visited[i - 1] continue. 两数相等直接跳过。 !visited[i - 1] 如果前面的数字没选取过,则不能选后面这个相同的数字
//排列(雨露均沾) //nums[i] == nums[i - 1] && !visited[i - 1] continue. 两数相等直接跳过 class Solution { public List<List<Integer>> permuteUnique(int[] nums) { List<List<Integer>> res = new ArrayList<>(); //corner case if(nums == null || nums.length == 0) return res; Arrays.sort(nums); boolean[] visited = new boolean[nums.length]; for(int i = 0; i < nums.length; i++){ visited[i] = false; } dfs(nums, res, new ArrayList<Integer>(), visited); return res; } private void dfs(int[] nums, List<List<Integer>> res, List<Integer> subset, boolean[] visited){ if(subset.size() == nums.length){ res.add(new ArrayList<Integer>(subset)); return; } for(int i = 0; i < nums.length; i++){ if(visited[i]) continue; if(i >= 1 && nums[i] == nums[i - 1] && !visited[i - 1]) continue; subset.add(nums[i]); visited[i] = true; dfs(nums, res, subset, visited); subset.remove(subset.size() - 1); visited[i] = false; } } }