把所有的数全部统计出来,根据index,每次从其中拿出一个,++index。自然用的都是递归。不要再像全排列I似的swap。官方题解写的很清楚了。为了避免重复,每次在for中添加数字的时候不让添加重复的数字,因此传入的是哈希表。
#include#include #include #include using namespace std; vector >ret; int n; void recursion(vector a, unordered_map notused, int index) { if(index >= n) ret.push_back(a); for(auto notindex : notused) { auto newnotused = notused; if(1==notindex.second) newnotused.erase(notindex.first); else --newnotused.find(notindex.first)->second; auto b = a; b.push_back(notindex.first); recursion(b, newnotused, index+1); } return; } vector > permuteUnique(vector & nums) { n = (int)nums.size(); unordered_map notused; for(int i=0; i<(int)nums.size(); ++i) { auto it_notused = notused.find(nums[i]); if(it_notused == notused.end()) notused.insert(pair (nums[i], 1)); else ++it_notused->second; } vector a; recursion(a, notused, 0); return ret; } int main(void) { vector a={2,2,1,1}; permuteUnique(a); return 0; }
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)