46 47全排列

本文详细介绍了如何使用递归算法解决全排列问题,包括不含重复数字的数组全排列以及包含重复数字的序列的全排列。通过示例代码展示了Java实现的全排列函数,以及如何通过回溯法避免重复排列。同时,对于全排列II,引入了HashSet来存储唯一排列,确保结果的不重复性。
摘要由CSDN通过智能技术生成
  1. 全排列
    给定一个不含重复数字的数组 nums ,返回其 所有可能的全排列 。你可以 按任意顺序 返回答案。
    示例 1:
    输入:nums = [1,2,3]
    输出:[[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2],[3,2,1]]
    示例 2:
    输入:nums = [0,1]
    输出:[[0,1],[1,0]]
    示例 3:
    输入:nums = [1]
    输出:[[1]]
public List<List<Integer>> permute(int[] nums) {
        List<List<Integer>>ans=new ArrayList<>();
        List<Integer>temp=new ArrayList<>();
        for(int num:nums)
        {
            temp.add(num);
        }
        int n=nums.length;
        dfs(n,ans,temp,0);
        return ans;
    }
    public void dfs(int n,List<List<Integer>>ans,List<Integer>temp,int index)
    {
    //如果已经到了最后,应该添加进去
       if(index==n)
           ans.add(new ArrayList<>(temp));
           //回溯方法,交换第i个元素和第index个元素
       for(int i=index;i<n;i++)
       {
           Collections.swap(temp,index,i);
           dfs(n,ans,temp,index+1);
           Collections.swap(temp,index,i);
       }
    }
  1. 全排列 II
    给定一个可包含重复数字的序列 nums ,按任意顺序 返回所有不重复的全排列。
    示例 1:
    输入:nums = [1,1,2]
    输出:
    [[1,1,2],
    [1,2,1],
    [2,1,1]]
    示例 2:
    输入:nums = [1,2,3]
    输出:[[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2],[3,2,1]]
    由于元素可以重复,因此需要考虑放入数组的唯一性,用set集合可以避免重复
List<List<Integer>>ans=new ArrayList<>();
    List<Integer>temp=new ArrayList<>();
    Set<List<Integer>>set=new HashSet<>();
    public List<List<Integer>> permuteUnique(int[] nums) {
        //
        for(int i=0;i<nums.length;i++)
        {
            temp.add(nums[i]);
        }
        dfs(0,ans,temp,nums);
    return ans;
    }

    public void dfs(int index,List<List<Integer>>ans,List<Integer>temp,int[] nums)
    {
        if(index==nums.length&&set.add(new ArrayList<>(temp)))
        {
            ans.add(new ArrayList<>(temp));
        }
        for(int i=index;i<nums.length;i++)
        {

            Collections.swap(temp,i,index);
            dfs(index+1,ans,temp,nums);

            Collections.swap(temp,i,index);
        }

    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值