Permutations II

Given a collection of numbers that might contain duplicates, return all possible unique permutations.

Example:

Input:
 [1,1,2]

Output:

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

Analysis

这一题接Permutations,用常规模板,要注意的是duplicate的处理。有重复元素时,通常会先sort,这样处理起来比较方便,因为sort后,重复元素会具有连续的index。

LeetCode上有一个很有意思的讨论帖:https://leetcode.com/problems/permutations-ii/discuss/18594/Really-easy-Java-solution-much-easier-than-the-solutions-with-very-high-vote

就是在于当判断出现重复元素时,如何处理。帖主给出的是:

if(i>0 &&nums[i-1]==nums[i] && !used[i-1]) continue;

但是人们发现以下同样可以work:

其实区别就在于是出现重复元素的时候,是用第一个还是最后一个。帖主的方法更优化。

简单一点的理解就是因为在循环中,如果nums[i - 1]用过了,那么在backtracking的时候其实是会把used[i - 1]重新设成false的,used[ i - 1]为false,其实是说明nums[ i - 1]在i - 1的时候被使用过了。

另外还有一个更好的方式,直接增加一个内层循环,跑出连续的重复元素:

Solution

Backtracking - 1

Backtracking - 2

相比Permutations,只是在permuteHelper的for-loop里面最后增加了一段,来skip掉重复的元素

Backtracking - Swap

https://leetcode.com/problems/permutations-ii/discuss/18648/Share-my-Java-code-with-detailed-explanantion

Last updated

Was this helpful?