题目链接
英文链接:https://leetcode.com/problems/permutations-ii/
中文链接:https://leetcode-cn.com/problems/permutations-ii/
题目详述
给定一个可包含重复数字的序列,返回所有不重复的全排列。
示例:
1 | 输入: [1,1,2] |
题目详解
本题与 LeetCode46-全排列 区别在于数字可能重复。思路是一致的,需要在原来的基础上去重。
首先判断是否重复,重复直接跳过,不重复才继续操作。
每次尝试固定一个位置,然后进入下一层。
- 回到本层时恢复原状。
- 递归的终止条件是当前固定位置的下标为
nums.length
,将这个排列加入结果集中。
1 | public class LeetCode_00046 { |
无论是否有重复的数字,全排列的生成规则都是适用的。故代码与 LeetCode46-全排列 完全相同。
首先按照从小到大的顺序进行排序,得到第一个排列。
从后往前找到第一组位置,满足
nums[i] < nums[i + 1]
。找不到说明已经是最后一个排列,返回 false。- 从后往前找到第一个位置,满足
nums[i] < nums[j]
。 - 交换 i、j 两处的值。
- 反转从位置
i + 1
到末尾的序列,得到下一个排列,返回 true。
1 | public class LeetCode_00046 { |