LeetCode47:Permutations II
2015-06-04 11:02
537 查看
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].
这道题是打印一个整型数组的所有组合的问题。并且数组中可能有重复元素,之前在
字符串排序与八皇后问题这篇博客中就详细讨论了字符串排序的各种问题,这里就不在分析了。直接上代码:
class Solution { public: vector<vector<int>> permuteUnique(vector<int>& nums) { vector<vector<int>> result; permute(nums,0,result); return result; } void permute(vector<int> & nums,int offset,vector<vector<int>> & result) { //当最后需要排列的元素只剩下一个时即终止递归,将此时的nums存储到结果集result中。 if(nums.size()==offset+1) { result.push_back(nums); return ; } //base指针用来指向需要递归的部分的首地址,iter指针是个变化的指针 vector<int>::iterator base=nums.begin()+offset;//base的起始是offset vector<int>::iterator iter=base;//iter的起始是base,这里不要加上1,不然下面就没法递归了 for(;iter!=nums.end();iter++) { //下面这个循环是用来判断是否有重复元素的关键 vector<int>::iterator tmp; bool flag=true; for(tmp=base;tmp!=iter;tmp++) { if(*tmp==*iter) flag=false; } if(flag) { swap(*base,*iter);//stl中本身就有swap函数,所以不需要自己实现了 permute(nums,offset+1,result); swap(*iter,*base); } } } };
runtime:32ms
需要注意的是一些编程细节方面的问题,比如迭代器的起始位置到什么地方终止。
相关文章推荐
- C++中const、volatile、mutable的用法
- LintCode - Subarray Sum Zero
- 操作系统处理内存时内存页为4k
- 在Android中实现Digets密码认证(在安卓中用Authenticator不起作用)
- 传iPhone 6s Plus或配2K屏 分辨率全面飙升
- 操作系统处理内存时内存页为4k
- 在centos5 git服务器端安装
- sql查询
- Vijava 学习笔记之(Template 克隆虚拟机并修改Template 指定虚拟磁盘大小)
- 每天一道算法题(11)——栈的push、pop 序列
- 每天一道算法题(11)——栈的push、pop 序列
- windows 7以上操作系统文件共享
- 本人新博客地址
- wince 2416 应用程序更改屏参
- yum update 报错db4 - 4.3.29-10.el5_5.2.i386
- linux c++动态链接库so编写
- Win10 CPU占用资源太高运行很卡怎么解决?
- 计算机图形几何算法详解勘误
- PO RELEASE 采购订单审核(支持多级审核)
- 关于jstl标签c:foreach相关属性讲解