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);
                }
            }
            
        }
    }
}

运行结果:

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

比如首先是[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

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值