首頁>技術>

題目:給定一個可包含重複數字的序列 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;}

這個意思是 當前元素使用過就跳過。或者 當前元素與前一個元素相等,而且前一個元素沒有被使用過就跳過, 因為我們排序後,相同的元素需要按照從前往後的順序去取,若前一個元素還沒被使用過,就證明當前步驟不合法,就跳過。

當前文章和上一篇文章是回溯演算法裡很經典的題目,求得輸入引數的全排列。

7
最新評論
  • BSA-TRITC(10mg/ml) TRITC-BSA 牛血清白蛋白改性標記羅丹明
  • 設計模式之 外觀模式