【每日一題-leetcode】 47.全排列 II

47.全排列 II

  1. 全排列 II

難度中等281

給定一個可包含重複數字的序列,返回所有不重複的全排列。

示例:

輸入: [1,1,2]
輸出:
[
  [1,1,2],
  [1,2,1],
  [2,1,1]
]
此問題和46是相同的思路,使用回溯法 在查找所有解的時候 使用剪枝 取出掉不符合的條件。

代碼的實現主要是通過一個boolean數組來判斷。如果訪問過 continue 如果當前和上一個元素相等  並且上一個元素已經visited 直接continue 。否則就添加。剩下就是回溯法的模板代碼。

選擇 》 進入下層決策樹 》撤銷樹

List<List<Integer>> result = new ArrayList<>();
    //backtrack
    public List<List<Integer>> permuteUnique(int[] nums) {
        if(nums.length == 0 || nums == null)    return null;
        Arrays.sort(nums);
        findUnique(nums,0,new boolean[nums.length],new LinkedList<Integer>());
        return result;
    }

    private void findUnique(int [] nums,int start,boolean [] visited,LinkedList<Integer>  track){
        //1.終止條件
        if(nums.length ==  track.size()){
            result.add(new LinkedList<>(track));
            return;
        }

        for(int i=0;i<nums.length;i++){
            //如果訪問過 直接continue
            if(visited[i]) continue;
            //如果當前節點和前一個節點相等 並且 前一個節點已經被訪問過了,直接continue
            if(i>0 && nums[i] == nums[i-1] && visited[i-1])  continue;
            
            //選擇
            track.add(nums[i]);
            visited[i] = true;
            //進入下一層決策樹
            findUnique(nums,i+1,visited,track);
            //撤銷選擇
            track.removeLast();
            visited[i] = false;
        }
    }
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章