文章目录
- 题目描述
- 示例
- 解题
- 思路
- 代码
- leetcode展示
LeetCode刷题之全排列
题目描述
给定一个没有重复数字的序列,返回其所有可能的全排列。
示例
输入: [1,2,3]
输出:
[
[1,2,3],
[1,3,2],
[2,1,3],
[2,3,1],
[3,1,2],
[3,2,1]
]
解题
思路
找出所有的路径这道题我的第一反应是肯定是要用回溯的了。
排列的递归树是这样的:当选中一个元素后,下一个元素只要不是这个元素就行。
我们只需要确定n个位置的数字即可(n是需要排列数组的长度),由此第一位的数字我们可以在原数组里面随便选,第二个只要不是第一个数字就可以随便选…一直到最后一个数字只能填写最后剩下的一个值,,,以此类推做出所有的可能。
注意数组和集合里面保存的是引用数据类型的地址,所以我们最后要深度克隆才行,否则你会发现你所返回的结果里面的数组都是一模一样的,因为他们都是指向同一个对象。
代码
class Solution {
List<List<Integer>> result = new ArrayList<>();
public List<List<Integer>> permute(int[] nums) {
set(nums,new Integer[nums.length],0);
return result;
}
private void set(int[] nums, Integer[] element, int n) {
if (nums.length == n) {
List<Integer> temp = new ArrayList<>();
for (int i = 0; i < n; i++) {
temp.add(element[i]);
}
result.add(temp);
return;
}
A:
for (int i = 0; i < nums.length; i++) {
for (int j = 0; j < n; j++) {
if (nums[i] == element[j]) {
continue A;
}
}
element[n] = nums[i];
set(nums, element, n + 1);
}
}
}
ps:在这段代码中,所有的结果都是由element数组装载的,所以最后我们要深度的赋值结果。