带重复元素的排列

该博客讨论了一个编程问题,即如何找到包含重复数字的列表的所有不同排列。提供的解决方案利用了回溯法和哈希映射进行去重。在Java代码中,通过递归帮助函数`help`实现了排列生成,并使用HashMap存储唯一排列以避免重复。最终,将HashMap的键转换为结果列表返回。
摘要由CSDN通过智能技术生成

描述

给出一个具有重复数字的列表,找出列表所有不同的排列。

样例

样例 1:

输入:

nums = [1,1] 

输出:

[ 
  [1,1] 
] 

解释:[1,1]的不同排列只有[1,1]。
样例 2:

输入:

nums = [1,2,2] 

输出:

[ 
  [1,2,2], 
  [2,1,2], 
  [2,2,1] 
] 

解释:[1,2,2]的不同排列有[1,2,2],[2,1,2],[2,2,1]。

这里由于带有重复的元素,因此进行去重操作,最简单的采用HashMap进行去重,把单个结果集放入到key中即可。

public class Solution {
        public  List<List<Integer>> permuteUnique(int[] nums) {
        // write your code here
        List<List<Integer>> list = new ArrayList<>();
        List<Integer> temp = new ArrayList<>();
        int[] start = new int[nums.length];
        for (int i = 0; i < nums.length; i++) {
            start[i] = 0;
        }
        Map<List<Integer>,String> map = new HashMap<>();
        help(nums,map,temp,start);
        for (List<Integer> listTemp:map.keySet()) {
            list.add(listTemp);
        }
        return list;
    }
    public void help(int[] nums, Map<List<Integer>,String> map, List<Integer> temp, int[] flage){
        if (temp.size()==nums.length){
            List<Integer> list1 = new ArrayList<>();
            for (int i = 0; i < temp.size(); i++) {
                list1.add(new Integer(temp.get(i)));
            }
            map.put(list1,"hello Java");
            return;
        }
        for (int i = 0; i < nums.length ; i++) {
            if (flage[i]==1) continue;
            temp.add(nums[i]);
            flage[i] = 1;
            help(nums,map,temp,flage);
            temp.remove(temp.size()-1);
            flage[i] = 0;
        }
    }
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值