permutations

思路

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;
    }
}