小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。
大家好今天给大家分享下一道 LeetCode 中等难度 的题目46. 全排列
题目
给定一个不含重复数字的数组
nums
,返回其 所有可能的全排列 。你可以 按任意顺序 返回答案。
分析
1.数组不含重复值
2.生成所有的组合,相同的元素不同的位置也算不同的组合
3.返回包含所有组合的二维数组
解法
*1.递归
*2.暴力
解法一:递归
思路
1.终止条件是 生成的数组的长度和nums的长度相等了
2.遍历nums里面的元素,判断参数的arr中是否已经包含了该值了,如果没有包含则进行递归
*/
var permute = function (nums) {
const res = [];
function recur(arr) {
// 生成的数组arr的长度和nums的长度相等了 就停止递归
if (arr.length === nums.length) {
res.push(arr);
return;
}
for (let i = 0; i < nums.length; i++) {
// 遍历nums里面的元素,判断参数的arr中是否已经包含了该值了,如果没有包含则进行递归
!arr.includes(nums[i]) && recur([...arr, nums[i]]);
}
}
recur([]);
return res;
};
/* 复杂度
时间 O(n*n!)
空间 O(n)
*/
解法二:暴力
思路
1.生成所有的可能值
2.去掉包含重复值的数组
*/
var permute = function (nums) {
const res = [];
function generateAll(arr) {
if (arr.length === nums.length) {
res.push(arr);
return;
}
for (let i = 0; i < nums.length; i++) {
generateAll([...arr, nums[i]]);
}
}
generateAll([]);
function valid(arr, n) {
const newArr = arr.filter((item, index) => {
return arr.indexOf(item) === index;
});
return newArr.length === n;
}
return res.filter((item) => {
return valid(item, nums.length);
});
};
/* 复杂度
时间 O(n^n)
空间 O(n!)
*/
总结
今天这道题是主要是练习递归的方式来处理生成类 的题目
大家可以看看我分享的一个专栏(前端搞算法)里面有更多关于算法的题目的分享,希望能够帮到大家,我会尽量保持每天晚上更新,如果喜欢的麻烦帮我点个赞,十分感谢
大家如果对“TS”感兴趣的可以看看我的专栏 (TypeScript常用知识),感谢大家的支持
文章内容目的在于学习讨论与分享学习算法过程中的心得体会,文中部分素材来源网络,如有侵权,请联系删除,邮箱 182450609@qq.com