leetcode 第46题和第47题 都是求一个给定数组中的全排列问题,不同之处在于47题中数组的元素可以重复。
leetcode 第46题 解题思路
这也是一个递归问题。对于数组中的每个元素,它的全排列就等于它本身加上除它以外所有的全排。所以只要这样依次计算全排列就行。
JAVA代码实现
class Solution {
List<List<Integer>> res = new ArrayList<>();
boolean[] used = null;
public List<List<Integer>> permuteUnique(int[] nums) {
res.clear();
if(nums.length==0) return res;
used = new boolean[nums.length];
permuteAux(nums,0, new ArrayList<>());
return res;
}
private void permuteAux(int[] nums,int index,List<Integer> st) {
if(index == nums.length){
List<Integer> t = new ArrayList<>(st);
res.add(t);
return;
}
for(int i=0;i<nums.length;i++){
if(used[i]) continue;
st.add(nums[i]);
used[i] = true;
permuteAux(nums,index+1,st);
used[i] = false;
st.remove(st.size()-1);
}
return;
}
}
leetcode 第47题 解题思路
这也是一个递归问题。解题思路与46图题基本一致,但是却必须做出一些,改变,首先必须使得数组有序,在对数组中的每个元素进行全排列的时候,如果该元素与前一个元素相同,且前面一个元素已经完成了全排列,则跳过这个元素。
JAVA代码实现
class Solution {
List<List<Integer>> res = new ArrayList<>();
boolean[] used = null;
public List<List<Integer>> permuteUnique(int[] nums) {
res.clear();
if(nums.length==0) return res;
used = new boolean[nums.length];
Arrays.sort(nums);
permuteAux(nums,0, new ArrayList<>());
return res;
}
private void permuteAux(int[] nums,int index,List<Integer> st) {
if(index == nums.length){
List<Integer> t = new ArrayList<>(st);
res.add(t);
return;
}
for(int i=0;i<nums.length;i++){
if(used[i]) continue;
if(i>0 &&nums[i-1]==nums[i] && !used[i-1]) continue;
st.add(nums[i]);
used[i] = true;
permuteAux(nums,index+1,st);
used[i] = false;
st.remove(st.size()-1);
}
return;
}
}