title: 全排列II
categories: 数据结构与算法
1 | 给定一个可包含重复数字的序列,返回所有不重复的全排列。 |
主要思路:整体思路和全排列是大致相同的,本题的难点在于如何剪枝,如何去重
如图所示,当我们把nums数组排好序后,我们思考一个问题,什么时候会产生重复的组合,红色框内标注的情况是和1是一样的,所以当num[i-1]==nums[i]时,可能会发生重复,当我们是要判断层重复,而不是枝重复,如果仅仅只有这个条件那么最左边一条路径在选取第二个i时,也无法选择
所以我们还需要另一个判重条件
我们在深入分析可以发现,其实我们要剪枝的部分是满足上述条件且刚刚撤销选择的部分,当我们撤销选择时,在重新选取下一个数时,如果num[i-1]==num[i]说明下面的情况都相同
剩下的代码和全排列相同
1 | public class PermuteUnique { |