leetcode-47. 全排列 II(回溯法)

博客介绍了如何使用回溯法解决包含重复数字的序列全排列问题。通过示例解释了算法过程,代码实现了一个回溯函数来避免重复,并给出了时间与内存效率方面的提示。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

47. 全排列 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]]

提示

  • 1 <= nums.length <= 8
  • -10 <= nums[i] <= 10
分析

与上列[全排列](#46. 全排列(回溯法))相似。不过使用Set存储所有结果,避免了数组重复。通过回溯法依次调整位置。

代码
public Set<List<Integer>> result = new HashSet<>();
public List<Integer> track = new ArrayList<>();
public List<List<Integer>> permuteUnique(int[] nums) {
    backtrack(nums, 0);
    return new ArrayList<>(result);
}

public void backtrack(int[] nums, int index){
    result.add(new ArrayList<>(track));
    for(int i=index;i<nums.length;i++){
        track.add(nums[i]);
        backtrack(nums, i+1);
        track.remove(track.size()-1);
    }
}
结果

时间超过11%

内存超过48%

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值