摘要:题目详情题目要求输入一个可能会有重复数字的数组,要求我们输出可能组成的全排列无重复排列。可以用来实现,但这种实现方式复杂度高。另外一种实现思路是,新声明一个数组来存储中元素的使用状况。以这个数组为例。
题目详情
Given a collection of numbers that might contain duplicates, return all possible unique permutations.思路
题目要求输入一个可能会有重复数字的数组nums,要求我们输出nums可能组成的全排列(无重复排列)。
这道题和 46题全排列 的差别就在于它可能存在重复数字,所以我们就要考虑重复数字可能造成的重复排列的问题。
一种思路就是我在没次为我的结果集res添加新的排列的时候 判断新添加的排列 是否已经存在于结果集中了。可以用hashset来实现,但这种实现方式复杂度高。
另外一种实现思路是,新声明一个boolean数组isUsed来存储nums中元素的使用状况。然后在生成当前排列curr的时候就避免重复排列的产生。
以[1,1*,2]这个数组为例。
对于每次遍历的元素nums[i],我们要判断它是否等于nums[i-1],如果相等而且nums[i-1]被使用过的话,就可以组成一个未出现的排序(eg.[1,1]),如果nums[i-1]未被使用过,那么我们不会将nums[i]添加进排列,避免产生[1,1]这样的重复排列。
解法public List> permuteUnique(int[] nums) { List
> res = new ArrayList
>(); boolean[] isUsed = new boolean[nums.length]; List
curr = new ArrayList (); Arrays.sort(nums); backtrack(res,isUsed,curr,nums); return res; } public void backtrack(List > res,boolean[] isUsed,List
curr,int[] nums){ if(nums.length == curr.size()){ res.add(new ArrayList (curr)); return; } for(int i=0;i 0 && nums[i] == nums[i-1] && !isUsed[i-1])continue; isUsed[i] = true; curr.add(nums[i]); backtrack(res,isUsed,curr,nums); isUsed[i] = false; curr.remove(curr.size()-1); } }
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/71098.html
摘要:当前的值如果已经被使用过,则继续判断下一个数值。则当第一个被添加进结果集时,可以继续使用第二个作为元素添加进结果集从而生成。假设将表示为那么结果集中会确保永远在数值的前面,从而避免了和的重复情况出现。 题目要求 Given a collection of numbers that might contain duplicates, return all possible unique ...
摘要:前言从开始写相关的博客到现在也蛮多篇了。而且当时也没有按顺序写现在翻起来觉得蛮乱的。可能大家看着也非常不方便。所以在这里做个索引嘻嘻。顺序整理更新更新更新更新更新更新更新更新更新更新更新更新更新更新更新更新 前言 从开始写leetcode相关的博客到现在也蛮多篇了。而且当时也没有按顺序写~现在翻起来觉得蛮乱的。可能大家看着也非常不方便。所以在这里做个索引嘻嘻。 顺序整理 1~50 1...
Permutations I Problem Given a list of numbers, return all possible permutations. Example For nums = [1,2,3], the permutations are: [ [1,2,3], [1,3,2], [2,1,3], [2,3,1], [3,1,2], [3,2,1]] Challe...
摘要:每一轮搜索选择一个数加入列表中,同时我们还要维护一个全局的布尔数组,来标记哪些元素已经被加入列表了,这样在下一轮搜索中要跳过这些元素。 Permutations I Given a collection of numbers, return all possible permutations. For example, [1,2,3] have the following permu...
摘要:解题思路这道题是要将排列按字典序排列,然后求出下一个排列,一种办法是我们先求出所有的排序情况,但是题目规定不能占有额外空间。每次求出一个数字后,要及时的把它从中删除掉。采用来构造结果序列。 PermutationsGiven a collection of distinct numbers, return all possible permutations. For example, ...
阅读 2664·2021-11-24 09:38
阅读 1978·2019-08-30 15:53
阅读 1234·2019-08-30 15:44
阅读 3228·2019-08-30 14:10
阅读 3577·2019-08-29 16:29
阅读 1798·2019-08-29 16:23
阅读 1099·2019-08-29 16:20
阅读 1469·2019-08-29 11:13