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,然后再加入到结果里面。

 

转载于:https://www.cnblogs.com/etcow/archive/2012/10/10/2717683.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值