难度:中等

    题目描述:
    给定一个 没有重复 数字的序列,返回其所有可能的全排列。

    示例:

    1. 输入: [1,2,3]
    2. 输出:
    3. [
    4. [1,2,3],
    5. [1,3,2],
    6. [2,1,3],
    7. [2,3,1],
    8. [3,1,2],
    9. [3,2,1]
    10. ]

    解题思路:
    利用递归的思想,
    (1)任意取一个元素放在第一个位置,则有n种选择;
    (2)再剩下的n-1个元素中再取一个元素放在第二个位置则有n-1种选择,此时可以看做对n-1个元素进行全排列;
    (3)重复第二步,直到对最后一个元素进行全排列,即最后一个元素放在最后一个位置,全排列结束

    var permute = function(arr) {
                let allArr = [];
                let newArr = [];
                const getArr = (data) => {
                    let num 
                    data.forEach((item, index) => {
                        num = data.splice(index, 1)[0]
                        newArr.push(num)
                        if (data.length === 0 ){
                            allArr.push(newArr.slice())
                        }
                        getArr(data)
                        data.splice(index, 0, num);  // 为了恢复data
                        newArr.pop(); // 为了清空newArr
                    });
                    return allArr;
                }
                return getArr(arr);
    };
    
    function backtrack(list, tempList, nums) {
        if (tempList.length === nums.length) return list.push([...tempList]);
        for(let i = 0; i < nums.length; i++) {
            if (tempList.includes(nums[i])) continue;
            tempList.push(nums[i]);
            backtrack(list, tempList, nums);
            tempList.pop();
        }
    }
    /**
     * @param {number[]} nums
     * @return {number[][]}
     */
    var permute = function(nums) {
        const list = [];
        backtrack(list, [], nums)
        return list
    };