给你一个包含不同整数的集合,返回集合中所有数字的排列数的情况。
1 . 递归实现
List<Integer> list = null;
List<List<Integer>> all = new ArrayList<>(); // 存放所有可能的排列数
// 递归实现
public List<List<Integer>> permute(int[] nums)
{
int len = nums.length - 1;
// 先对数组nums的情况进行判读
if (nums == null || nums.length == 0)
{
return all;
}
// 递归产生全排列
perm(nums, 0, len);
return all;
}
void perm(int[] nums, int k, int m)
{
// 产生nums[k:m]的所有排列
if (k == m)
{
list = new ArrayList<>();
// 只剩下一个元素
for (int i=0; i<=m; i++)
{
list.add(nums[i]);
}
all.add(list);
}
else
{
// 还有多个元素待排列,递归产生排列
for (int i=k; i<=m; i++)
{
// 交换nums[k]和nums[i]的值
int tmp = nums[k];
nums[k] = nums[i];
nums[i] = tmp;
perm(nums, k+1, m);
// 恢复nums[k]和nums[i]的值
tmp = nums[k];
nums[k] = nums[i];
nums[i] = tmp;
}
}
}
2. 回溯法
public List<List<Integer>> permute(int[] nums)
{
List<List<Integer>> all = new ArrayList<>(); // 存放所有的排列数
backtrack(all, new ArrayList<>(), nums);
return all;
}
void backtrack(List<List<Integer>> all, List<Integer> list, int[] nums)
{
if (list.size() == nums.length)
{
all.add(new ArrayList<>(list));
}
else
{
for (int i=0; i<nums.length; i++)
{
if (list.contains(nums[i])) // 跳过包含的元素
continue;
list.add(nums[i]);
backtrack(all, list, nums);
list.remove(list.size()-1); // 移除末尾元素
}
}
}