LintCode:M-带重复元素的排列

来源:互联网 发布:淘宝秋水兰熙旗舰店 编辑:程序博客网 时间:2024/05/16 12:00

LintCode链接


给出一个具有重复数字的列表,找出列表所有不同的排列。

样例

给出列表 [1,2,2],不同的排列有:

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

import java.util.*;class Solution {    /**     * @param nums: A list of integers.     * @return: A list of unique permutations.     */    public List<List<Integer>> permuteUnique(int[] nums) {        // Write your code here        List<List<Integer>> res = new ArrayList<List<Integer>> ();        int n = nums.length;        Arrays.sort(nums);        int[] visited = new int[n];                helper(res, new ArrayList<Integer>(), nums, visited);                return res;    }         void helper(List<List<Integer>> res, List<Integer> tRes, int[] nums, int[] visited){        if(tRes.size()==nums.length){            List<Integer> tmp = new ArrayList<Integer>();            tmp.addAll(tRes);            res.add(tmp);            return;        }                for(int i=0; i<nums.length; i++){            //访问过,或者前面已经出现过相同的数字            if(visited[i]==1 || (i-1>=0 && visited[i-1]==0 && nums[i-1]==nums[i])){                continue;            }else{                visited[i]=1;                tRes.add(nums[i]);                helper(res, tRes, nums, visited);                tRes.remove(tRes.size()-1);                visited[i]=0;            }        }    }}