题目地址
https://leetcode-cn.com/problems/permutations-ii/
题目描述
Given a collection of numbers, nums, that might contain duplicates, return all possible unique permutations in any order.
Example 1:
Input: nums = [1,1,2]
Output:
[[1,1,2],
[1,2,1],
[2,1,1]]
Example 2:
Input: nums = [1,2,3]
Output: [[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2],[3,2,1]]
Constraints:
- 1 <= nums.length <= 8
- -10 <= nums[i] <= 10
思路
在上一题递归的代码实现基础上修改一下,见46题。
我们先排序一下,然后对相邻元素进行判断,不会对同一位置递归同样的元素。
题解
class Solution {
boolean[] vis;
List<List<Integer>> lists = new ArrayList<List<Integer>>();
List<Integer> list = new ArrayList<Integer>();
public void permutation(int n,int[] nums,int cur){
if(cur==n)
lists.add(new ArrayList<Integer>(list));
else for(int i=0;i< nums.length;++ i){
int ok=1;
if(vis[i]||(i>0&&nums[i]==nums[i-1]&&!vis[i-1])) ok=0;
if(ok==1){
list.add(nums[i]);
vis[i] = true;
permutation(n,nums,cur+1);
list.remove(list.size()-1);
vis[i] = false;
}
}
}
public List<List<Integer>> permuteUnique(int[] nums) {
vis = new boolean[nums.length];
Arrays.sort(nums);
permutation(nums.length,nums,0);
return lists;
}
}