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 }
  • 相关阅读:
    高并发秒杀系统架构设计 · 抢购、微信红包、一元夺宝
    Linux服务器集群系统(一)
    keepalived+nginx双机热备+负载均衡
    kafka的一些常用命令
    基于Keepalived实现LVS双主高可用集群
    如何生动形象、切中要点地讲解 OSI 七层模型和两主机传输过程
    MyBatis动态SQL foreach标签实现批量插入
    详解Vue生命周期
    centos 解压压缩包到指定目录
    门罗币(MONERO)钱包生成教程
  • 原文地址:https://www.cnblogs.com/codeskiller/p/6388553.html
Copyright © 2011-2022 走看看