c_cpp 给定可能包含重复项的数字集合,返回所有可能的唯一排列。例如,[1,1,2]有以下内容
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了c_cpp 给定可能包含重复项的数字集合,返回所有可能的唯一排列。例如,[1,1,2]有以下内容相关的知识,希望对你有一定的参考价值。
// idea, first, sort the array!
// it seems like I do not need the visit array!!!
#include <iostream>
#include <vector>
#include <string>
#include <algorithm>
using namespace std;
bool has_duplicates(vector<int> &nums, int begin, int i) {
for(int j=begin; j<i; j++)
if(nums[j] == nums[i]) return true;
return false;
}
void dfs(vector<vector<int>> &res, vector<int> &one, vector<bool> visit,
int start, int n, vector<int> &nums) {
if(start == n) {
res.push_back(one);
return;
}
for(int i=start; i<n; i++) {
//if(visit[i] == true) continue; // gist
//if(i>start && nums[i] == nums[i-1] ) continue; // wrong!!!!!
if(has_duplicates(nums, begin, i)) continue;
swap(num[start], num[i]);
one.push_back(nums[start]);
dfs(res, one, visit, start+1, n, nums);
one.pop_back();
swap(num[start], num[i]);
}
}
vector<vector<int>> get_premutation(vector<int> &nums) {
vector<vector<int>> res;
vector<int> one;
vector<bool> visit(nums.size(), false);
sort(nums.begin(), nums.end()); // gist!!!!
dfs(res, one, visit, 0, nums.size(), nums);
return res;
}
int main()
{
vector<int> nums = {1, 1, 3, 2};
vector<vector<int>> res = get_premutation(nums);
for(vector<int> v : res) {
for(auto i : v) cout << i << " ";
cout << endl;
}
return 0;
}
以上是关于c_cpp 给定可能包含重复项的数字集合,返回所有可能的唯一排列。例如,[1,1,2]有以下内容的主要内容,如果未能解决你的问题,请参考以下文章
在递减然后递增并且可能包含重复项的列表中查找最小值
c_cpp 从一串单词中删除所有重复的单词。不只是重复,而是需要删除重复项的所有实例。
剑指 Offer II 082. 含有重复元素集合的组合
c_cpp 给定一组单词,返回给定集合中的anagrams集合
如何使用 LINQ 从一组数字中查找 n 项的所有组合?
Leetcode刷题Python剑指 Offer II 082. 含有重复元素集合的组合