zoukankan      html  css  js  c++  java
  • leetcode--47. Permutations II

    1、问题描述

    Given a collection of numbers that might contain duplicates, return all possible unique permutations.

    For example,
    [1,1,2] have the following unique permutations:

    [
      [1,1,2],
      [1,2,1],
      [2,1,1]
    ]

    2、边界条件:无,空数组也可以统一处理

    3、思路:递归,先排序方便去重。然后跟正常排列一样,加一个去重操作。特别注意5种失效的方法。

    4、代码实现

    class Solution {
        public List<List<Integer>> permuteUnique(int[] nums) {
            List<List<Integer>> results = new ArrayList<>();
            Arrays.sort(nums);
            List<Integer> numList = new ArrayList<>();
            for (int i = 0; i < nums.length; i++) {
                numList.add(nums[i]);
            }
            permuteUnique(results, new ArrayList<Integer>(), numList);
            return results;
        }
    
        public void permuteUnique(List<List<Integer>> results, List<Integer> cur,
                                  List<Integer> numList) {
            if (0 == numList.size()) {
                List<Integer> result = new ArrayList<>(cur);
                results.add(result);
                return;
            }
            for (int i = 0; i < numList.size(); i++) {
                if (i != 0 && numList.get(i) == numList.get(i - 1)) {
                    continue;
                }
                cur.add(numList.get(i));//这种result可以用int[]试一下
                numList.remove(i);
                permuteUnique(results, cur, numList);
                numList.add(i, cur.get(cur.size() - 1));
                cur.remove(cur.size() - 1);
            }
        }
    }

    5、一种在无重复数字情况下有效,在有重复数字的情况下失效的方法

    class Solution {
        public List<List<Integer>> permuteUnique(int[] nums) {
            List<List<Integer>> results = new ArrayList<>();
            Arrays.sort(nums);
            permuteUnique(results, nums, 0);
            return results;
        }
    
        public void permuteUnique(List<List<Integer>> results,
                                  int[] nums, int index) {
            if (index == nums.length) {
                List<Integer> result = new ArrayList<>();
                for (int i = 0; i < index; i++) {
                    result.add(nums[i]);
                }
                results.add(result);
                return;
            }
            for (int i = index; i < nums.length; i++) {
                if (i != index && nums[i] == nums[i - 1]) {
                    continue;
                }
                swap(nums, i, index);//问题出来这里,改变了数组的结构,使得数组变得无序。
                permuteUnique(results, nums, index + 1);
                swap(nums, i, index);
            }
        }
    
        public void swap(int[] nums, int i, int j) {
            int temp = nums[i];
            nums[i] = nums[j];
            nums[j] = temp;
        }
    }

    if (i != index && nums[i] == nums[i - 1]),这个判断在不改边数组结构的情况下是可以达到去重目的的。但是我这里用的方法改变了nums的结构,使得主函数里面sort好的nums又变成无序,从而去不了重。就拿[0, 1, 0, 0, 9]来说,排好序之后[0, 0, 0, 1, 9],在index=0时,交换0<-->9,变成[9, 0, 0, 1, 0],变得无序,使得去重方法失效。需要再把顺序调整下,但是恢复不了。所以在有重复数字的情况下这个改变nums结构的方法不能用。

    6、api

  • 相关阅读:
    【bzoj1499】[NOI2005]瑰丽华尔兹 【单调队列优化dp】
    【poj3709】K-Anonymous Sequence 【斜率优化dp】
    【bzoj4566】[Haoi2016]找相同字符【后缀自动机】
    【Play】蜂鸣器音乐 校歌
    【poj2373】Dividing the Path【单调队列优化dp】
    【bzoj2010】SubString【后缀自动机+LCT】
    【bzoj1047】[HA蛤OI2007]理想的正方形【单调队列】
    【poj1743】Musical Theme【后缀数组】
    【bzoj4293】[PA2015]Siano【线段树】
    【bzoj4553】[Tjoi2016&Heoi2016]序列【树套树 树状数组套平衡树】
  • 原文地址:https://www.cnblogs.com/shihuvini/p/7460808.html
Copyright © 2011-2022 走看看