LeetCode算法学习之--Recursion--46. 全排列

285 阅读1分钟

小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。

大家好今天给大家分享下一道 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