数组交换元素法
这里的回溯在于:
- 在前index-1个元素的位置有确定的情况下
index 这个位置,可以由index->nums.length的每个位置的元素担任
所以用一个for循环来把各个元素换到index这个位置上
class Solution {
public List<List<Integer>> permute(int[] nums) {
Arrays.sort(nums);
List<List<Integer>> result = new ArrayList<>();
permute(nums, 0, result);
return result;
}
private void permute(int[] nums, int index, List<List<Integer>> result) {
if(index == nums.length) {
result.add(convertArrayToList(nums));
} else {
for(int i = index; i < nums.length; i++) {
swap(nums, index, i);
permute(nums, index + 1, result );
swap(nums, index, i);
}
}
}
private void swap(int[] nums, int i, int j) {
int temp = nums[i];
nums[i] = nums[j];
nums[j] = temp;
}
private List<Integer> convertArrayToList(int[] nums) {
List<Integer> list = new ArrayList<>();
for(int i : nums) {
list.add(i);
}
return list;
}
}
子集添加元素法
- 新建一个子集
回溯法,每次往子集里面加一个之前没加过的元素
class Solution {
public List<List<Integer>> permute(int[] nums) {
List<List<Integer>> result = new ArrayList<>();
permute(nums, new ArrayList<>(), result);
return result;
}
private void permute(int[] nums, List<Integer> subSet, List<List<Integer>> result) {
if(subSet.size() == nums.length) {
result.add(new ArrayList<>(subSet));
} else {
for(int i = 0; i < nums.length; i++) {
if(!subSet.contains(nums[i])) {
subSet.add(nums[i]);
permute(nums, subSet, result);
subSet.remove(subSet.size()-1);
}
}
}
}
}