
思路
1、c++已经有响应的库函数实现了
2、使用递归来解决,维护一个已经使用过的元素的链表,时间复杂度为O(n2)
3、从第一元素开始一次和后面的元素进行位置交换,时间复杂度为n!
代码
本次采用第三种算法来计算:
#include <cstdio>
#include <algorithm>
#include <iostream>
#include <vector>
using namespace std;
class N46Permutations {
public:
bool canSwap(vector<int> &nums, int start, int end) {
for (int i = start; i < end; i++) {
if (nums[i] == nums[end]) {
return false;
}
}
return true;
}
void allRange(vector<vector<int> > &vc, vector<int> &nums, int start) {
if (start == nums.size() - 1) {
vector<int> ans;
for (int i = 0; i < nums.size(); i++) {
ans.push_back(nums[i]);
}
vc.push_back(ans);
return;
}
for (int i = start; i < nums.size(); i++) {
if (start !=i && canSwap(nums, start, i)) {
swap(nums[start], nums[i]);
allRange(vc, nums, start + 1);
swap(nums[i], nums[start]);
}
if (start == i) {
allRange(vc, nums, start + 1);
}
}
}
vector<vector<int>> permuteUnique(vector<int> &nums) {
vector<vector<int> > vc;
if (nums.empty()) {
return vc;
}
allRange(vc, nums, 0);
return vc;
}
};
int main() {
N46Permutations s;
vector<int> nums;
nums.push_back(1);
nums.push_back(2);
nums.push_back(3);
nums.push_back(4);
int ans;
vector<vector<int> > vc = s.permute(nums);
for (int i = 0; i < vc.size(); i++) {
for (int j = 0; j < vc[i].size(); j++) {
if (j != 0) {
cout << " ";
}
cout << vc[i][j];
}
cout << endl;
}
}




近期评论