LeetCode 第47題 全排列2
阿新 • • 發佈:2018-11-09
(一) 題目描述
給定一個可包含重複數字的序列,返回所有不重複的全排列
示例:
輸入:[1,1,2]
輸出:
[
[1,1,2]
[1,2,1]
[2,1,1]
]
(二)解題演算法
- 先對給定的序列nums進行排序,使得大小相同的元素排在一起.
- 新建一個used陣列,大小與nums相同,用來標記在本次DFS讀取中位置 i 的元素是否已經新增到list中了.
- 根據思路可知,我們選擇跳過一個數,當且僅當這個數與前一個數相等,並且前一個數未被新增到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 = newArrayList<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; } } }
迷茫的盡頭,就是光明