Leetcode算法Java全解答–47. 全排列 II
题目
给定一个可包含重复数字的序列,返回所有不重复的全排列。
示例
输入: [1,1,2]
输出:
[
[1,1,2],
[1,2,1],
[2,1,1]
]
想法
利用046的方法,多加一个boolean[] visit = new boolean[nums.length];,将已经加入进去的数据设为true
还有个核心就是Arrays.sort(nums); 对数组进行排序
结果
超过43%的测试案例
时间复杂度/空间复杂度: /
总结
代码
我的答案
public List<List<Integer>> permuteUnique(int[] nums) {
if (nums.length == 0) {
return Collections.EMPTY_LIST;
}
Arrays.sort(nums);
boolean[] visit = new boolean[nums.length];
List<List<Integer>> result = new ArrayList<>();
List<Integer> smallResult = new ArrayList<>();
repick(nums, result, smallResult, visit);
return result;
}
private void repick(int[] nums, List<List<Integer>> result, List<Integer> smallResult, boolean[] visit) {
System.out.println("result: " + result.toString() + "smallResult: " + smallResult.toString());
if (smallResult.size() == nums.length) {
// result.add(new ArrayList<Integer>(smallResult));
result.add(smallResult);
} else {
for (int i = 0; i < nums.length; i++) {
if (visit[i] || (i > 0 && nums[i] == nums[i - 1] && !visit[i - 1])) {
continue;
}
visit[i] = true;
List<Integer> tmp = new ArrayList<>(smallResult);
// smallResult.add(nums[i]);
tmp.add(nums[i]);
repick(nums, result, tmp, visit);
// smallResult.remove(smallResult.size() - 1);
visit[i] = false;
}
}
}
大佬们的答案
List<List<Integer>> result = new ArrayList<>();
public List<List<Integer>> better(int[] nums) {
if (nums.length == 0) {
return result;
}
Arrays.sort(nums);
func(new ArrayList<Integer>(), nums, new boolean[nums.length]);
return result;
}
private void func(List<Integer> candidates, int[] nums, boolean[] used) {
if (candidates.size() == nums.length) {
result.add(new ArrayList<>(candidates));
}
//不能直接add(candidates)
else {
for (int i = 0; i < nums.length; ++i) {
if (used[i] || (i != 0 && nums[i] == nums[i - 1] && !used[i - 1])) {
continue;
}
used[i] = true;
candidates.add(nums[i]);
func(candidates, nums, used);
used[i] = false;
candidates.remove(candidates.size() - 1);
}
}
}
测试用例
@Test
public void test047() {
// 创建测试案例
int[] arr1 = new int[] { 1, 1, 2 };
// 测试案例期望值
List<List<Integer>> expResult1 = new ArrayList<>();
List<Integer> list1 = new ArrayList<>();
list1.add(1);
list1.add(1);
list1.add(2);
List<Integer> list2 = new ArrayList<>();
list2.add(1);
list2.add(2);
list2.add(1);
List<Integer> list3 = new ArrayList<>();
list3.add(2);
list3.add(1);
list3.add(1);
expResult1.add(list1);
expResult1.add(list2);
expResult1.add(list3);
// 执行方法
Solution047 solution047 = new Solution047();
List<List<Integer>> result1 = solution047.permuteUnique(arr1);
// 判断期望值与实际值
Assert.assertEquals(expResult1, result1);
}
其他
代码托管码云地址:https://gitee.com/lizhaoandroid/LeetCodeAll.git
查看其他内容可以点击专栏或者我的博客哈:https://blog.csdn.net/cmqwan
“大佬们的答案” 标签来自leetcode,侵权请联系我进行删改
如有疑问请联系,联系方式:QQ3060507060