題目:給定一個可包含重複數字的序列 nums ,按任意順序 返回所有不重複的全排列。
標籤:回溯演算法
示例:
輸入:nums = [1,1,2]輸出:[[1,1,2], [1,2,1], [2,1,1]]
public static List<List<Integer>> permuteUnique(int[] nums) { Arrays.sort(nums); List<List<Integer>> res = new ArrayList<>(); back(nums, new boolean[nums.length], new ArrayList<>(), res); return res; } public static void back(int[] nums, boolean[] used, List<Integer> pick, List<List<Integer>> res) { if (pick.size() == nums.length) { res.add(new ArrayList<>(pick)); return; } for (int i = 0; i < nums.length; i++) { if (used[i] || i > 0 && nums[i] == nums[i - 1] && !used[i - 1]) { continue; } pick.add(nums[i]); used[i] = true; back(nums, used, pick, res); used[i] = false; pick.remove(pick.size() - 1); } }
以上解答是學習上一篇回溯演算法中的方法二,利用boolean[]陣列,當然,輸入陣列得先進行排序,然後,在回溯的時候,每次取值判斷如下
if (used[i] || i > 0 && nums[i] == nums[i - 1] && !used[i - 1]) { continue;}
這個意思是 當前元素使用過就跳過。或者 當前元素與前一個元素相等,而且前一個元素沒有被使用過就跳過, 因為我們排序後,相同的元素需要按照從前往後的順序去取,若前一個元素還沒被使用過,就證明當前步驟不合法,就跳過。
當前文章和上一篇文章是回溯演算法裡很經典的題目,求得輸入引數的全排列。
最新評論