LeetCode 46,78,90.全排列,子集,子集II(排列組合問題,回溯,位運算)

遞歸+回溯

class Solution {
    public List<List<Integer>> subsets(int[] nums) {
        List<List<Integer>> result = new ArrayList<List<Integer>>();
        ArrayList<Integer> list = new ArrayList<>();
        subsetHelper(result,list,nums,0);
        return result;
    }
    private void subsetHelper(List<List<Integer>> result, ArrayList<Integer> list, int[] nums, int pos){
        result.add(new ArrayList<Integer>(list));
        for(int i = pos; i < nums.length; i++){
            list.add(nums[i]);
            subsetHelper(result,list,nums,i+1);
            list.remove(list.size()-1);
        }
    }
}

位運算

class Solution {
    public List<List<Integer>> subsets(int[] nums) {
        List<List<Integer>> ans = new ArrayList<>();
        for (int i = 0; i < 1 << nums.length; i++) {
            List<Integer> path = new ArrayList<>();
            for (int j = 0; j < nums.length; j++) {
                if ((i >> j & 1) == 1) {
                    path.add(nums[j]);
                }
            }
            ans.add(path);
        }
        return ans;
    }
}

子集II

與前題相似,將nums[]排序,把重複元素放在一起只取一個(去重)即可。

class Solution {
    public List<List<Integer>> subsetsWithDup(int[] nums) {
        List<List<Integer>> result = new ArrayList<List<Integer>>();
        ArrayList<Integer> list = new ArrayList<>();
        Arrays.sort(nums); //將重複元素放在一起
        subsetHelper(result,list,nums,0);
        return result;
    }
    private void subsetHelper(List<List<Integer>> result, ArrayList<Integer> list, int[] nums, int pos){
        result.add(new ArrayList<Integer>(list));
        for(int i = pos; i < nums.length; i++){
            if(i != pos && nums[i] == nums[i-1]) //去重
                continue;
            list.add(nums[i]);
            subsetHelper(result,list,nums,i+1);
            list.remove(list.size()-1);
        }
    }
}

在這裏插入圖片描述

Permutations 全排列

套用模板

class Solution {
    public List<List<Integer>> permute(int[] nums) {
        List<List<Integer>> result = new ArrayList<List<Integer>>();
        List<Integer> list = new ArrayList<Integer>();
        permuteHelp(result,list,nums);
        return result;
    }
    public void permuteHelp(List<List<Integer>> result,List<Integer> list,int[] nums){
        if(list.size() == nums.length){
            result.add(new ArrayList<Integer>(list));
            return;
        }
        for(int i = 0; i < nums.length; i++){
            if(list.contains(nums[i]))
                continue;
            list.add(nums[i]);
            permuteHelp(result,list,nums);
            list.remove(list.size()-1);
        }
        return;
    }
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章