1. 程式人生 > >LeetCode 第47題 全排列2

LeetCode 第47題 全排列2

  (一)  題目描述

給定一個可包含重複數字的序列,返回所有不重複的全排列
示例:
輸入:[1,1,2]
輸出:
[
[1,1,2]
[1,2,1]
[2,1,1]
]


(二)解題演算法
  1. 先對給定的序列nums進行排序,使得大小相同的元素排在一起.
  2. 新建一個used陣列,大小與nums相同,用來標記在本次DFS讀取中位置 的元素是否已經新增到list中了.
  3. 根據思路可知,我們選擇跳過一個數,當且僅當這個數與前一個數相等,並且前一個數未被新增到list中.



(三)LeetCode AC程式碼

public class Solution {

    List
<List<Integer>> res = new ArrayList<List<Integer>>(); public List<List<Integer>> permuteUnique(int[] nums) { int len = nums.length; if(len==0||nums==null) return res; boolean[] used = new boolean[len]; List<Integer> list = new
ArrayList<Integer>(); Arrays.sort(nums); dfs(nums, used, list, len); return res; } public void dfs(int[] nums, boolean[] used, List<Integer> list, int len) { if(list.size()==len) { res.add(new ArrayList<Integer>(list));
return ; } for (int i=0; i<len; i++) { // 當前位置的數已經在List中了 if(used[i]) continue; // 當前元素與其前一個元素值相同 且 前元素未被加到list中,跳過該元素 if(i>0 && nums[i]==nums[i-1] && !used[i-1]) continue; // 深度優先搜尋遍歷 used[i]=true; list.add(nums[i]); dfs(nums, used, list, len); list.remove(list.size()-1); used[i]=false; } } }

 







          迷茫的盡頭,就是光明