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

    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]
    ]

    本题开始并没有什么办法来解决重复数字的问题,后来想到了以前做过的contains duplicate的方法,可以先把数组排序,然后比较前一个数字和当前数字是否相等来判断是否有重复数字,但是
    仍然解决不了本题,因为我们之前在permutation1里面用的排除法是list.contains()函数做的,如果用在这个题目上面,那么就不能把重复数字加入list里面了,我们就要另外设置一个used
    数组来专门存放是否使用过该数字,数组的想法很巧妙,contains是对整体是否包含的排除,而used数组是对每一个number进行排除。判断当前used为false时候,看他前面的数字是否和他一样,
    如果一样,并且used为false,则表示以前使用过这个,就不能再插入这个了,如果为true,则表示可以继续插入,因为是第一次插入。代码如下:
     1 public class Solution {
     2     public List<List<Integer>> permuteUnique(int[] nums) {
     3         List<List<Integer>> res = new ArrayList<>();
     4         Arrays.sort(nums);
     5         backtracking(nums,res,new ArrayList<Integer>(),new boolean[nums.length]);
     6         return res;
     7     }
     8     public void backtracking(int[] nums,List<List<Integer>> res,List<Integer> list,boolean[] used){
     9         if(list.size()==nums.length) res.add(new ArrayList<Integer>(list));
    10         else{
    11             for(int i=0;i<nums.length;i++){
    12                 if(used[i]||i>0&&nums[i-1]==nums[i]&&used[i-1]) continue;
    13                 used[i] = true;
    14                 list.add(nums[i]);
    15                 backtracking(nums,res,list,used);
    16                 used[i] = false;
    17                 list.remove(list.size()-1);
    18             }
    19         }
    20     }
    21 }
  • 相关阅读:
    C#的委托事件总结
    iOS的录屏功能
    Unity通过NTP获取网络时间
    Unity的弱联网Json数据传输
    Unity场景和代码合并以及UnityYAMLMerge的使用
    Unity学习--捕鱼达人笔记
    Yomob广告在cocos2dx安卓平台的Demo
    谷歌广告Admob在cocos2dx上通过回调实现底部Banner
    JZ2440 裸机驱动 第13章 LCD控制器(2)
    JZ2440 裸机驱动 第13章 LCD控制器(1)
  • 原文地址:https://www.cnblogs.com/codeskiller/p/6388553.html
Copyright © 2011-2022 走看看