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

Posted by lizhao on 07-09,2019

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

[toc]

题目

给定一个可包含重复数字的序列,返回所有不重复的全排列。

示例

输入: [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