1. 程式人生 > >Leetcode演算法Java全解答--47. 全排列 II

Leetcode演算法Java全解答--47. 全排列 II

Leetcode演算法Java全解答–47. 全排列 II

文章目錄

題目

給定一個可包含重複數字的序列,返回所有不重複的全排列。

示例

輸入: [1,1,2]
輸出:
[
  [1,1,2],
  [1,2,1],
  [2,1,1]
]
  

想法

利用046的方法,多加一個boolean[] visit = new boolean[nums.length];,將已經加入進去的資料設為true

還有個核心就是Arrays.sort(nums); 對陣列進行排序

結果

超過43%的測試案例

時間複雜度/空間複雜度: /

總結

程式碼

我的答案

   public List<List<Integer>> permuteUnique(int[] nums) {
        if (nums.length == 0) {
            return Collections.EMPTY_LIST;
        }
        Arrays.sort(nums);
        boolean[] visit = new boolean[nums.length];
        List<List<Integer>> result = new ArrayList<>();
        List<Integer> smallResult = new ArrayList<>();
        repick(nums, result, smallResult, visit);
        return result;
    }

    private void repick(int[] nums, List<List<Integer>> result, List<Integer> smallResult, boolean[] visit) {
        System.out.println("result: " + result.toString() + "smallResult: " + smallResult.toString());
        if (smallResult.size() == nums.length) {
            //            result.add(new ArrayList<Integer>(smallResult));
            result.add(smallResult);

        } else {
            for (int i = 0; i < nums.length; i++) {
                if (visit[i] || (i > 0 && nums[i] == nums[i - 1] && !visit[i - 1])) {
                    continue;
                }
                visit[i] = true;
                List<Integer> tmp = new ArrayList<>(smallResult);
                //                smallResult.add(nums[i]);
                tmp.add(nums[i]);
                repick(nums, result, tmp, visit);
                //                smallResult.remove(smallResult.size() - 1);
                visit[i] = false;
            }

        }
    }

大佬們的答案

List<List<Integer>> result = new ArrayList<>();

    public List<List<Integer>> better(int[] nums) {
        if (nums.length == 0) {
            return result;
        }
        Arrays.sort(nums);
        func(new ArrayList<Integer>(), nums, new boolean[nums.length]);
        return result;
    }

    private void func(List<Integer> candidates, int[] nums, boolean[] used) {
        if (candidates.size() == nums.length) {
            result.add(new ArrayList<>(candidates));
        }
        //不能直接add(candidates)
        else {
            for (int i = 0; i < nums.length; ++i) {
                if (used[i] || (i != 0 && nums[i] == nums[i - 1] && !used[i - 1])) {
                    continue;
                }
                used[i] = true;
                candidates.add(nums[i]);
                func(candidates, nums, used);
                used[i] = false;
                candidates.remove(candidates.size() - 1);
            }
        }
    }

測試用例

    
    @Test
    public void test047() {
        // 建立測試案例
        int[] arr1 = new int[] { 1, 1, 2 };

        // 測試案例期望值
        List<List<Integer>> expResult1 = new ArrayList<>();
        List<Integer> list1 = new ArrayList<>();
        list1.add(1);
        list1.add(1);
        list1.add(2);
        List<Integer> list2 = new ArrayList<>();
        list2.add(1);
        list2.add(2);
        list2.add(1);
        List<Integer> list3 = new ArrayList<>();
        list3.add(2);
        list3.add(1);
        list3.add(1);
        expResult1.add(list1);
        expResult1.add(list2);
        expResult1.add(list3);

        // 執行方法
        Solution047 solution047 = new Solution047();
        List<List<Integer>> result1 = solution047.permuteUnique(arr1);

        // 判斷期望值與實際值
        Assert.assertEquals(expResult1, result1);

    }

其他

程式碼託管碼雲地址:https://gitee.com/lizhaoandroid/LeetCodeAll.git

檢視其他內容可以點選專欄或者我的部落格哈:https://blog.csdn.net/cmqwan

“大佬們的答案” 標籤來自leetcode,侵權請聯絡我進行刪改

如有疑問請聯絡,聯絡方式:QQ3060507060