[LintCode] 带重复元素的排列

递归实现:

 1 class Solution {
 2 public:
 3     /**
 4      * @param nums: A list of integers.
 5      * @return: A list of unique permutations.
 6      */
 7     vector<vector<int> > permuteUnique(vector<int> &nums) {
 8         // write your code here
 9         sort(nums.begin(), nums.end());
10         vector<vector<int> > permutations;
11         if (nums.empty()) return permutations;
12         permutate(nums, 0, permutations);
13         return permutations;
14     }
15 private:
16     void permutate(vector<int> nums, int start, vector<vector<int> >& permutations) {
17         if (start == nums.size()) {
18             permutations.push_back(nums);
19             return;
20         }
21         for (int i = start; i < (int)nums.size(); i++) {
22             if (i == start || nums[i] != nums[start]) {
23                 swap(nums[start], nums[i]);
24                 permutate(nums, start + 1, permutations);
25             }
26         }
27     }
28 };

非递归实现(基于nextPermutation):

 1 class Solution {
 2 public:
 3     /**
 4      * @param nums: A list of integers.
 5      * @return: A list of unique permutations.
 6      */
 7     vector<vector<int> > permuteUnique(vector<int> &nums) {
 8         // write your code here
 9         vector<vector<int> > permutations;
10         if (nums.empty()) return permutations;
11         vector<int> copy(nums.begin(), nums.end());
12         nextPermutation(nums);
13         permutations.push_back(nums);
14         while (nums != copy) {
15             nextPermutation(nums);
16             permutations.push_back(nums);
17         }
18         return permutations;
19     }
20 private:
21     void nextPermutation(vector<int>& nums) {
22         int k = -1, n = nums.size();
23         for (int i = n - 2; i >= 0; i--) {
24             if (nums[i] < nums[i + 1]) {
25                 k = i;
26                 break;
27             }
28         }
29         if (k == -1) {
30             reverse(nums.begin(), nums.end());
31             return;
32         }
33         int l;
34         for (int i = n - 1; i > k; i--) {
35             if (nums[i] > nums[k]) {
36                 l = i;
37                 break;
38             }
39         }
40         swap(nums[l], nums[k]);
41         reverse(nums.begin() + k + 1, nums.end());
42     }
43 };
时间: 2024-10-21 22:12:54

[LintCode] 带重复元素的排列的相关文章

lintcode:子集 &amp; 带重复元素的子集

地址: http://lintcode.com/zh-cn/problem/subsets/ http://lintcode.com/zh-cn/problem/subsets-ii/ 子集 其实就是一颗子集树 class Solution { public: vector<vector<int>> res; vector<int> judge; int len; /* * @param nums: A set of numbers * @return: A list

lintcode 中等题:subsets II 带重复元素的子集

题目 带重复元素的子集 给定一个可能具有重复数字的列表,返回其所有可能的子集 样例 如果 S = [1,2,2],一个可能的答案为: [ [2], [1], [1,2,2], [2,2], [1,2], [] ] 注意 子集中的每个元素都是非降序的 两个子集间的顺序是无关紧要的 解集中不能包含重复子集 挑战 你可以同时用递归与非递归的方式解决么? 解题 一个很简单的想法就是在上一题目中增加判断是否已经存在某个子集 class Solution: """ @param S: A

九章算法面试题54 带重复元素的全排列

九章算法官网-原文网址 http://www.jiuzhang.com/problem/54/ 题目 给定一个带重复元素的整数集合,求出这个集合中所有元素的全排列.对于集合[1,1,2],其本质不同的全排列有三个,分别为: [1,1,2] [1,2,1] [2,1,1] 在线测试本题 http://lintcode.com/problem/unique-permutations/ 解答 首先做这个题目之前,要先会不带重复元素的全排列. 程序参考:http://www.ninechapter.co

UVA - 11076 Add Again (重复元素的排列)

Summation of sequence of integersis always a common problem in Computer Science. Rather than computing blindly,some intelligent techniques make the task simpler. Here you have to find thesummation of a sequence of integers. The sequence is an interes

蓝桥杯——说好的进阶之去重复元素的排列组合

将待排列(组合)的数组,先分别统计出种类和个数,然后进行避免重复的排列(组合). /* 1,1,2,3的排列组合 去重复 * (借此复习排列组合) * * 1:2 2个1 * 2:1 1个2 * 3:1 1个3 * * */ static int[] iarr = new int[3];//目标序列 static int[] carr = new int[] { 1, 2, 3 };//3种item static int[] used = new int[] { 2, 1, 1 };//每种it

含有重复元素的排列

Description 设R={ r1, r2, ……, rn }是要进行排列的n个元素.其中元素r1 ,r2 ,……,rn可能相同.试设计一个算法,列出R的所有不同排列.给定n以及待排列的n个元素.计算出这n个元素的所有不同排列. Input 输入数据的的第1行是元素个数n,1≤n≤500.接下来的1行是待排列的n个元素. Output 将计算出的n个元素的所有不同排列输出,每种排列占1行,最后1行中的数是排列总数. Sample Input 4 aacc Sample Output aacc

无重复元素的排列

/*========================================================== 设有n个整数的集合{1,2,3,......,n},从中任意选择r个数进行排列. 其中r<n,请列出所有排列. 思路:递归r层,每层选择一个数放到a[].当递归到r层时得到一组排列. 在每一层中做选择的时候,要把所有可能的选择都进行尝试. 具体看代码. ============================================================*/

枚举有重复元素的排列的两种方法

我们假设A数组是方案数组,P数组是模板数组. 对于每一种方案,从第一个位置开始放元素,一个一个放. 我们原有的打印全排列的方法是不允许A数组中出现重复元素的,如下代码所示: void dfs(int dp) { if(dp>n) { for(int i=1;i<=n;i++) cout<<a[i]<<" "; ans++; cout<<endl; return; } for(int i=1;i<=n;i++) { if(!vis[i

有重复元素的排列问题

问题描述:设R={r1,r2,···,rn}是要进行排列的n个元素.其中元素r1,r2···rn可能相同.试设计一个算法,列出R的所有不同排列 算法设计:给定n及待排列的n个元素,计算出这n个元素的所有不同排列 设计思路:共有m个数的数组,排列到第k位时查看数组下标从k到m的数中是否有数字与下标为k的数字相等,相等的不交换,不相等则交换得新排列 #include<stdio.h> #include<stdlib.h> #include <string.h> void S