文章目录




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数组装载的,所以最后我们要深度的赋值结果。

leetcode展示

LeetCode之全排列_算法