Skip to content

全排列 #32

@JesseZhao1990

Description

@JesseZhao1990

image

/**
 * @param {number[]} nums
 * @return {number[][]}
 */
var permute = function(nums) {
    if(nums.length===0) return [];
    var used = {};
    var res = [];
    
    function combine(nums,index,s){
        if(index === nums.length){
            res.push([...s]);
            return;
        }
        for(var i=0;i<nums.length;i++){
            if(!used[i]){
                s.push(nums[i]);
                used[i]= true;
                combine(nums,index+1,s);
                
                s.pop();  // 恢复现场
                used[i]=false;   // 恢复现场
            }
        }
        return;
    }
    
    combine(nums,0,[]);
    return res;
};

解题思路

image

用res记录收集的结果。用s记录深度遍历时捡到的值。一旦达到叶子节点的时候,就把捡到的值放到res中。然后回溯。 这里需要注意的是,在深度遍历的过程中,已遍历的数字,不要再参与遍历了。所以需要有一个字段来记录一下在之前的路径中是否已经使用过某个数字。而且在回溯的过程中。s数组需要恢复原状。

LeetCode原题地址:https://leetcode-cn.com/problems/permutations/description/

Metadata

Metadata

Assignees

No one assigned

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions