LeetCode 0047 Permutations II
作者:互联网
1. 题目描述
2. Solution
1、思路分析
此题是「46. 全排列」的进阶,序列中包含了重复的数字,要求我们返回不重复的全排列,那么我们依然可以选择使用搜索回溯的方法来做。
只需要注意,要解决重复问题,我们只要设定一个规则,保证在填第i个数的时候重复数字只会被填入一次即可。而在本题解中,我们选择对原数组排序,保证相同的数字都相邻,然后每次填入的数一定是这个数所在重复数集合中「从左往右第一个未被填过的数字」,即如下的判断条件:
if (used[i] || i > 0 && nums[i] == nums[i - 1] && !used[i - 1]) continue;
2、代码实现
package Q0099.Q0047PermutationII;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
public class Solution {
public List<List<Integer>> permuteUnique(int[] nums) {
List<List<Integer>> list = new ArrayList<>();
Arrays.sort(nums);
backtrack(list, new ArrayList<>(), nums, new boolean[nums.length]);
return list;
}
/*
DFS: Depth First Search, 深度优先搜索,从图中某个顶点v0出发,访问此顶点,然后依次从v0的未被访问的邻接点出发递归地进行同样的深度
优先搜索,直至图中所有和v0有路径相通的顶点都被访问到。
*/
private void backtrack(List<List<Integer>> list, ArrayList<Integer> curRes, int[] nums, boolean[] used) {
if (curRes.size() == nums.length) {
list.add(new ArrayList<>(curRes));
} 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;
curRes.add(nums[i]);
backtrack(list, curRes, nums, used);
used[i] = false;
curRes.remove(curRes.size() - 1);
}
}
}
}
3、复杂度分析
标签:used,nums,ArrayList,Permutations,list,II,&&,curRes,LeetCode 来源: https://www.cnblogs.com/junstat/p/16070049.html