题目描述:
给定一个可包含重复数字的序列,返回所有不重复的全排列。
示例:
输入: [1,1,2]
输出:
[
[1,1,2],
[1,2,1],
[2,1,1]
]
题解:
class Solution { public List<List<Integer>> permuteUnique(int[] nums) { List<Integer> list = new ArrayList<>(); //以下的操作需要保证顺序性 Arrays.sort(nums); for(int index =0;index<nums.length;index++){ list.add(nums[index]); } List<List<Integer>> resList = new ArrayList<>(); backList(list,resList,new Stack<>(),nums.length); return resList; } public static void backList(List<Integer> list, List<List<Integer>> resList, Stack<Integer> res, Integer in){ if(res.size() == in){ resList.add(new ArrayList<>(res)); return; } for(int li=0;li<list.size();li++ ){ //对于重复元素,大概就是如此解决,大于起始元素 if(li>0 && list.get(li) == list.get(li-1)){continue;} res.push(list.get(li)); //相当于状态重置的作用。或者使用一个列表用来表示哪些数据已经使用 List temp = new ArrayList<>(list); temp.remove(list.get(li)); backList(temp,resList,res,in); temp = null; res.pop(); } } }