Leetcode 46 47 Permutation

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

猜你喜欢

转载自www.cnblogs.com/stiles/p/Leetcode46.html