「这是我参与2022首次更文挑战的第21天,活动详情查看:2022首次更文挑战」。
题目描述
给定一个不含重复数字的数组 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] <= 10
- nums 中的所有整数 互不相同
题目链接:[全排列]
思路介绍
最开始 最外层循环i=0 此时添加1进入path 然后进入递归,也就进入了中间层的循环 i=0,不行,因为1已经在path里面了 中间层的i=1,可以,添加2进入path,然后进入递归,进入了最里层的循环i=0,不行,最里层的i=1,不行,最里层的i=2,可以,添加3到path里面 再进行递归,此时path.size()==nums.length了,存数据,跳出,执行最里层i=2的path.removeLast(),删除掉了3,此时回到中间层的i=1,又执行一次中间层i=1的path.removeLast() 此时删除掉了2,path只有1了,中间层i=1就算结束 进入中间层的i=2,添加了3进入path,此时path中是1,3,然后进入最里层循环i=0,不行,最里层的1,可以,添加2到path里面,此时path又满了,再次存数据,跳出。 执行最里层i=1的remove,此时剩下1,3。执行最里层的i=2,不行。 此时中间层i=2的backtracking就算运行完了,remove,此时path中只有1了 然后最外层i=0时的backtracking也算运行完了,remove,此时path就没有东西了 执行最外层i=1,然后操作流程就如上进行重复 整个流程就是这样走nums.length次,也就是for的次数
因此path中是null-> 1 -> 1,2->1,2,3(result.add)->1,2->1->1,3->1,3,2(result.add)->1,3->1-null->2->2,1-2,1,3(result.add)->...->3,2,1->...->null 因为最后一定是null,所以result.add(new LinkedList<>(path)) 而不能是result.add(path)
代码
class Solution {
LinkedList<Integer> path=new LinkedList<>();
List<List<Integer>> result=new ArrayList<>();
public List<List<Integer>> permute(int[] nums) {
backtracking(nums);
return result;
}
public void backtracking(int[] nums){
if(path.size()==nums.length){
result.add(new LinkedList<>(path));
return;
}
for(int i=0;i<nums.length;i++){
if(path.contains(nums[i])){
continue;
}
path.add(nums[i]);
backtracking(nums);
path.removeLast();
}
}
}
运行结果
执行结果:通过
执行用时:1 ms,
内存消耗:41.5MB