<BackTracking> 254 47

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;
        }
        
    }
}

猜你喜欢

转载自www.cnblogs.com/Afei-1123/p/12006286.html
47