47.全排列 II
- 全排列 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;
}
}