您的位置:首页 > 其它

Permutations II

2015-10-02 18:34 323 查看
题目:

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]
,
and
[2,1,1]
.
分析:
貌似做过,不造怎么又跳出来了,但是跳出来的时候有代码,然后我就修改了下,然后竟然成功了yeah!!

原代码:

public static List<List<Integer>> permuteUnique(int[] nums) {
List<List<Integer>> list = new ArrayList<List<Integer>>();
boolean[] visited = new boolean[nums.length];
List<Integer> inner = new ArrayList<Integer>();
permuteUnique(nums, 0, inner, visited, list);
return list;
}
public static void permuteUnique(int[] nums, int index, List<Integer> inner, boolean[] visited, List<List<Integer>> list) {
if(inner.size() == nums.length){
if(!list.contains(inner)){
list.add(new ArrayList<Integer>(inner));
}
return;
}
for(int i = index; i < nums.length; i++){
if(i != index && find(nums, index, i, nums[i]))
if(visited[i])continue;
visited[i] = true;
inner.add(nums[i]);
permuteUnique(nums, index + 1, inner, visited, list);
visited[i] = false;
inner.remove(inner.size() - 1);
}
}

private static boolean find(int[] nums, int s, int e, int target) {
// TODO Auto-generated method stub
for (int i = s; i < e; i++) {
if (nums[i] == target) {
return true;
}
}
return false;
}


修改过后的代码:

public class Solution {
public static List<List<Integer>> permuteUnique(int[] nums) {
List<List<Integer>> list = new ArrayList<List<Integer>>();
Arrays.sort(nums);
boolean[] visited = new boolean[nums.length];
List<Integer> inner = new ArrayList<Integer>();
permuteUnique(nums,  inner, visited, list);
return list;
}
public static void permuteUnique(int[] nums, List<Integer> inner, boolean[] visited, List<List<Integer>> list) {
if(inner.size() == nums.length){
if(!list.contains(inner)){
list.add(new ArrayList<Integer>(inner));
}
return;
}
for(int i = 0; i < nums.length; i++){
if(i >= 1 && !visited[i - 1] && nums[i] == nums[i - 1]) continue;

if (visited[i])continue;
visited[i] = true;
inner.add(nums[i]);
permuteUnique(nums,  inner, visited, list);
visited[i] = false;
inner.remove(inner.size() - 1);
}
}
}


这里用 if(i >= 1 && !visited[i - 1] && nums[i] == nums[i - 1])代替if(i > index && nums[i] == nums[i - 1])

之前有每次i从index下标开始遍历,可以保证前面重复的元素已经用过一次了,而这里每次从下标0开始,如果不用!visited[i - 1],就会导致重复的元素第一次被调用的时候,就跳过去了,即如果是【1,1】的话,访问第2个1的时候,第1个1已经访问过了,visited[i - 1] = true,直接continue了,会返回空。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: