Leetcode 46 47 Permutation, 77 combination

Permutation

class Solution {
    List<List<Integer>> res = new ArrayList<List<Integer>>();
    int visited[];
    public List<List<Integer>> permute(int[] nums) {
        visited = new int[nums.length];
        //foreach pos, get tall number
        ArrayList<Integer> pos = new ArrayList<>();
        back(pos,nums, visited);
        return res;
    }
    void back(ArrayList<Integer> pos, int[] nums, int[] visited){
        if(pos.size()>=nums.length){
            List<Integer> temp =new ArrayList<>(pos);//!!!!!!!!!!!why copy this, immunatable like string (always deal with only one list)
            res.add(temp);
            return;
        }
        for(int i = 0; i<nums.length; i++){
            if(visited[i]==0){
                pos.add(nums[i]);
                visited[i] = 1;//index of nums
                back(pos, nums,visited);
                visited[i] = 0;
                pos.remove(pos.size()-1);
            }
        }
    }
}

the structure of backtracking

why copy the list

generic list

 

47: duplicate elements

if contains the element

class Solution {
    List<List<Integer>> res = new ArrayList<List<Integer>>();
    int visited[];
    public List<List<Integer>> permuteUnique(int[] nums) {
        visited = new int[nums.length];
        //foreach pos, get tall number
        ArrayList<Integer> pos = new ArrayList<>();
        back(pos,nums, visited);
        return res;
    }
    void back(ArrayList<Integer> pos, int[] nums, int[] visited){
        if(pos.size()>=nums.length){
            List<Integer> temp =new ArrayList<>(pos);//!!!!!!!!!!!why copy this, immunatable like string (always deal with only one list)
            if(!res.contains(temp))
                res.add(temp);
            return;
        }
        for(int i = 0; i<nums.length; i++){
            if(visited[i]==0){
                pos.add(nums[i]);
                visited[i] = 1;//index of nums
                back(pos, nums,visited);
                visited[i] = 0;
                pos.remove(pos.size()-1);
            }
        }
        
    }
}

 why both using visited array

Because we can only use each element once

 

Combination accoring order

class Solution {
    //for each position(two) set number
    List<List<Integer>> res = new ArrayList<List<Integer>>();
    boolean[] visited ;
    public List<List<Integer>> combine(int n, int k) {
        visited = new boolean[n+1];
        back(0, n,k, new ArrayList<Integer>(),1);
        return res;
    }
    void back(int pos, int n, int k, List<Integer> list, int num){
        if(pos>=k){
            List<Integer> temp = new ArrayList(list);
            res.add(temp);
            return;
        }
        for(int i = num; i<=n; i++){
            if(!visited[i]){
                list.add(i);
                visited[i] = true;
                back(pos+1, n, k, list,i+1);
                visited[i] = false;
                list.remove(list.size()-1);
            }
        }
    }
}

//

check the num in back function

we need increasing number because (1,2) and (2,1) are the same things

 

//prev: 137 317 (without order)
//contains 1 2 3 , 1 2 3,
//visited 1 1 5, 1 5 1, visite element once for each path

posted @ 2018-05-14 06:24  wz30  阅读(127)  评论(0编辑  收藏  举报