[LintCode] 带重复元素的排列
2015-07-07 01:23
330 查看
递归实现:
非递归实现(基于nextPermutation):
class Solution { public: /** * @param nums: A list of integers. * @return: A list of unique permutations. */ vector<vector<int> > permuteUnique(vector<int> &nums) { // write your code here sort(nums.begin(), nums.end()); vector<vector<int> > permutations; if (nums.empty()) return permutations; permutate(nums, 0, permutations); return permutations; } private: void permutate(vector<int> nums, int start, vector<vector<int> >& permutations) { if (start == nums.size()) { permutations.push_back(nums); return; } for (int i = start; i < (int)nums.size(); i++) { if (i == start || nums[i] != nums[start]) { swap(nums[start], nums[i]); permutate(nums, start + 1, permutations); } } } };
非递归实现(基于nextPermutation):
class Solution { public: /** * @param nums: A list of integers. * @return: A list of unique permutations. */ vector<vector<int> > permuteUnique(vector<int> &nums) { // write your code here vector<vector<int> > permutations; if (nums.empty()) return permutations; vector<int> copy(nums.begin(), nums.end()); nextPermutation(nums); permutations.push_back(nums); while (nums != copy) { nextPermutation(nums); permutations.push_back(nums); } return permutations; } private: void nextPermutation(vector<int>& nums) { int k = -1, n = nums.size(); for (int i = n - 2; i >= 0; i--) { if (nums[i] < nums[i + 1]) { k = i; break; } } if (k == -1) { reverse(nums.begin(), nums.end()); return; } int l; for (int i = n - 1; i > k; i--) { if (nums[i] > nums[k]) { l = i; break; } } swap(nums[l], nums[k]); reverse(nums.begin() + k + 1, nums.end()); } };
相关文章推荐
- 黑马程序员——C语言---数字九宫格游戏实战练习
- IOS开发 使用XIB自定义一个UIView
- Android自定义对话框(Dialog)位置,大小
- C语言 基础60题(4)
- JLabel自动换行
- MailTest
- [LintCode] 全排列
- javaweb(一):sax解析xml
- iOS开发系列课程(02) --- 视图交互和事件机制
- linux用户环境变量
- select、poll、epoll之间的区别总结
- 九章系统设计
- 2015.07.06总结
- hadoop 面试小结
- 网站URL重写(Java UrlRewrite 的使用)
- weiphp 微调研数据管理控制器
- unity3d开源Ultimate MMORPG插件技术文档菜鸟翻译第6页
- AjaxFileUpload 方法与原理分析
- Tezign教程 | 交互设计学习者必读的20本书
- uva 1601 poj 3523 Morning after holloween 万圣节后的早晨 (经典搜索,双向bfs+预处理优化+状态压缩位运算)