🚩传送门:牛客题目

题目

给出一组可能包含重复项的数字,返回该组数字的所有排列。结果以字典序升序排列。
要求:空间复杂度 [NC]42. 有重复项数字的所有排列 - 图1,时间复杂度 [NC]42. 有重复项数字的所有排列 - 图2
示例1:

输入:[1,1,2] 返回值:[[1,1,2],[1,2,1],[2,1,1]]

示例2:

输入:[0,1] 返回值:[[0,1],[1,0]]

解题思路:nextPermutation

通过 nextPermutation 将所有字典排序序列列出来

复杂度分析

时间复杂度: [NC]42. 有重复项数字的所有排列 - 图3

空间复杂度: [NC]42. 有重复项数字的所有排列 - 图4

我的代码

  1. public class Solution {
  2. public boolean nextPermutation(int[]nums){
  3. int i = nums.length - 2;
  4. //1. 找出 i<ii 的部分
  5. while (i >= 0 && nums[i] >= nums[i + 1]) {
  6. i--;
  7. }
  8. if (i < 0) {
  9. return false;
  10. }
  11. int j = nums.length - 1;
  12. //2. 找出 j>i 的部分
  13. while (j >= 0 && nums[i] >= nums[j]) {
  14. j--;
  15. }
  16. //3. 交换(i,j)
  17. swap(nums, i, j);
  18. //4. 反转 ii 之后元素
  19. reverse(nums, i + 1,nums.length-1);
  20. return true;
  21. }
  22. public ArrayList<ArrayList<Integer>> permuteUnique(int[] num) {
  23. //1. 先排序
  24. Arrays.sort(num);
  25. ArrayList<ArrayList<Integer>>res=new ArrayList<>();
  26. //2. 找字典排序
  27. do{
  28. ArrayList<Integer>list=new ArrayList<>();
  29. for(int e:num)list.add(e);
  30. res.add(list);
  31. }while(nextPermutation(num));
  32. //3. 返回结果集
  33. return res;
  34. }
  35. }