LeetCode第46题:Permutations(java实现)

题目描述:

LeetCode第46题:Permutations(java实现)

解题答案:

本题可以采用回溯法+递归实现,下面以输入为[1,2,3,]为例,对后面的代码进行一个直观的分析。

tempResult变化情况如下(tempResult为下面代码中的一个变量):

[1]---[1,2]---[1,2,3](添加)---[1,2]---[1]---[1,3]---[1,3,2](添加)---[1,3]---[1]---[]---[2]---[2,1]---[2,1,3](添加)---[2,1]---[2]---[2,3]---[2,3,1](添加)---[2,3]---[2]---[]---[3]---[3,1]---[3,1,2](添加)---[3,1]---[3]---[3,2]---[3,2,1](添加)

下面是代码:

class Solution {
    //本题目可以采用回溯法+递归进行求解
    public List<List<Integer>> permute(int[] nums) {
        List<List<Integer>> results=new ArrayList<>();
        recursion(results,new ArrayList<>(),nums);
        return results;
    }
    public void recursion(List<List<Integer>> results,List<Integer> tempResult,int[] nums){
        //判断:判断tempResult中的数据的长度是否等于nums的长度,如果相等,则相当于这是一个求解答案,添加到答案中
        if(tempResult.size()==nums.length){
            results.add(new ArrayList<>(tempResult));
        }else{//如果不等于nums的长度,说明还没有添加完成
            for(int i=0;i<nums.length;i++){
                if(tempResult.contains(nums[i])){
                    continue;
                }else{
                    //添加数据
                    tempResult.add(nums[i]);
                    //递归添加数据
                    recursion(results,tempResult,nums);
                    //退一步重新一遍跳到下面循环添加新的东西
                    tempResult.remove(tempResult.size()-1);
                }
            }
            
        }
    }
}

运行结果:

LeetCode第46题:Permutations(java实现)

还有一种方法:就是一个一个地插入:

比如首先是[1]-----[2,1],[1,2]------[3,2,1],[2,3,1],[2,1,3],[3,1,2][1,3,2][1,2,3]

下面是Python代码:

class Solution:
    def permute(self, nums: List[int]) -> List[List[int]]:
        perms = [[]]
        for n in nums:
            new_perms = []
            for perm in perms:
                for i in range(len(perm)+1):
                    new_perms.append(perm[:i] + [n] + perm[i:]) 
            perms = new_perms
        return perms