题目描述
leetcode上的46.全排列,难度为中等。
Tag:数组、回溯
给定一个不含重复数字的数组 nums ,返回其 所有可能的全排列 。你可以 按任意顺序 返回答案。
示例 1:
输入: nums = [1,2,3]
输出: [[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2],[3,2,1]]
示例 2:
输入: nums = [0,1]
输出: [[0,1],[1,0]]
示例 3:
输入: nums = [1]
输出: [[1]]
提示:
1 <= nums.length <= 6-10 <= nums[i] <= 10nums中的所有整数 互不相同
解题思路
lists中存放的是所有的结果集,list里面存放的是其中的一种可能,当所有数都用完了,即list.size() == nums.length,将list存到lists中,说明这一种可能成立,也是回溯的终止条件。
for循环遍历的是nums中的数据,题目给出数字不重复,则需要用contains方法判断是否存在重复的数字,如果存在,则跳出本次循环。其实当前数字只有两种可能,一是当前数字放到集合当前位置中,二是当前数字不放在当前位置中。
解题代码
public List<List<Integer>> permute(int[] nums) {
List<List<Integer>> lists = new ArrayList<>();
List<Integer> list = new ArrayList<>();
per(lists,list,nums);
return lists;
}
private void per(List<List<Integer>> lists,List<Integer> list,int[] nums){
//所有数都填完了
if(list.size()==nums.length) {
lists.add(new ArrayList<>(list));
return;
}
for(int i=0;i<nums.length;i++){
//如果list集合中不能存在重复的数
if(list.contains(nums[i])) continue;
//将此数加入到集合中
list.add(nums[i]);
per(lists,list,nums);
//将此数移除
list.remove(list.size()-1);
}
}
最后
这是[力扣Top100]系列第三篇文章,如果有错误的地方,欢迎指正,如果你有更好的解法,欢迎在评论区讨论。
如果你想了解更多内容,要记得关注我我,我的公众号【小超学编程】。