LeetCode Online Judge 题目C# 练习 - PermutationsII

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

For example,
[1,1,2] have the following unique permutations:
[1,1,2], [1,2,1], and [2,1,1].

 1         public static List<List<int>> PermutationsII(List<int> num)

 2         {

 3             List<List<int>> ret = new List<List<int>>();

 4 

 5             if (num.Count == 0)

 6                 return ret;

 7             if (num.Count == 1)

 8             {

 9                 ret.Add(num); 

10                 return ret;

11             }

12 

13             num.Sort();

14 

15             ret.Add(new List<int>(num));

16             while(NextPermutationII(num))

17                 ret.Add(new List<int>(num));

18             

19             return ret;

20         }

21 

22         public static bool NextPermutationII(List<int> num)

23         {

24             if (num.Count <= 1)

25                 return false;

26 

27             //find the falling edge

28             int edge = -1;

29             for (int i = num.Count - 2; i >= 0; i--)

30             {

31                 if (num[i] < num[i + 1])

32                 {

33                     edge = i;

34                     break;

35                 }

36             }

37 

38             if (edge > -1)

39             {

40                 //find replacement

41                 for (int i = edge + 1; i < num.Count; i++)

42                 {

43                     if (num[edge] >= num[i])

44                     {

45                         NextPermutationSwap(num, edge, i - 1);

46                         break;

47                     }

48                     if (i == num.Count - 1)

49                     {

50                         NextPermutationSwap(num, edge, i);

51                         break;

52                     }

53                 }

54             }

55             else

56             {

57                 return false;

58             }

59 

60             for (int i = edge + 1, j = num.Count - 1; i <= edge + (num.Count - edge - 1) / 2; i++, j--)

61             {

62                 NextPermutationSwap(num, i, j);

63             }

64             return true;

65         }

代码分析:

  先把输入数组排列一下,利用之前做的一题,找下一个permutation的那一题,改写一下函数,如果找到返回true,然后再加入到结果里面。

 

你可能感兴趣的:(LeetCode)