1、全排列(46)
地址:https://leetcode-cn.com/problems/permutations/
/*** @param {number[]} nums* @return {number[][]}*/// 入参是一个数组const permute = function(nums) {// 缓存数组的长度const len = nums.length// curr 变量用来记录当前的排列内容const curr = []// res 用来记录所有的排列顺序const res = []// visited 用来避免重复使用同一个数字const visited = {}// 定义 dfs 函数,入参是坑位的索引(从 0 计数)function dfs(nth) {// 若遍历到了不存在的坑位(第 len+1 个),则触碰递归边界返回if(nth === len) {// 此时前 len 个坑位已经填满,将对应的排列记录下来res.push(curr.slice())return}// 检查手里剩下的数字有哪些for(let i=0;i<len;i++) {// 若 nums[i] 之前没被其它坑位用过,则可以理解为“这个数字剩下了”if(!visited[nums[i]]) {// 给 nums[i] 打个“已用过”的标visited[nums[i]] = 1// 将nums[i]推入当前排列curr.push(nums[i])// 基于这个排列继续往下一个坑走去dfs(nth+1)// nums[i]让出当前坑位curr.pop()// 下掉“已用过”标识visited[nums[i]] = 0}}}// 从索引为 0 的坑位(也就是第一个坑位)开始 dfsdfs(0)return res};
