持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第27天,点击查看活动详情
给定一个不含重复数字的数组 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
中的所有整数 互不相同
解题思路
数组中只有一个元素([1]
)的时候,全排列就只有 1
种([[1]]
):
数组中有两个元素([1,2]
)的时候,全排列有 2
种([[1,2],[2,1]]
);
数组中有三个元素([1,2,3]
)的时候,全排列有 6
种([[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2],[3,2,1]]
)。
观察上面的结果可发现,全排列分别以每一个元素为第一个,然后以剩余的每一个元素为第二个,然后以剩余的每一个元素为第三个,以此类推...
很明显,每次选择一个剩余元素作为下一个元素的逻辑是相同的,所以本题可以通过递归解题。
递归函数接收两个参数(nums, arr)
,分别是待选择元素的数组和已选择元素的结果数组,每次遍历带选择数组,选取每一个作为下一个元素并递归调用该函数。递归函数的退出条件为 nums.length === 0
,此时说明带选择元素的数组为空,找到了一个新的全排列,将其插入到结果数组即可。
代码实现
var permute = function(nums) {
let res = []
function getRes(nums,arr){
if(nums.length===0){
res.push(arr)
return
}
for(let i = 0;i<nums.length;i++){
const _arr = [...arr]
const _nums = [...nums]
_arr.push(_nums.splice(i,1))
getRes(_nums,_arr)
}
}
getRes(nums,[])
return res
}
至此我们就完成了 leetcode-46-全排列
如有任何问题或建议,欢迎留言讨论!