输出1-5的排列组合的


#include<iostream>
#include<string>
#include<vector>
using namespace std;
class Solution {
public:
    vector<vector<int>> permute(int nums) {
        vector<vector<int>>res;
        dfs(res, nums-1, {{nums}});
        return res;
    }
    void dfs(vector<vector<int>>& res, int num, vector<vector<int>>re) {
        if (num == 0)
            return;
        vector<vector<int>>peli;
        for (int j = 0; j < re.size(); j++) {
            vector<int>tmp(re[j]);
            for (int i = 0; i < 5 - num + 1; i++) {
                tmp.insert(tmp.begin() + i, num);
                peli.push_back(tmp);
            }
        }
        dfs(res, num - 1, peli);
        if (num == 1)
            res = peli;
    }
};
int main() {
    Solution a;
    vector<vector<int>>ok;
    ok=a.permute(5);
    for (int i = 0; i < ok.size(); i++) {
        for (int j = 0; j < 5; j++) {
            cout << ok[i][j] << " ";
        }
        cout << endl;
    }
}

输出1-5的排列组合
思路:初始re数组只有5,利用递归,先将4插入到数组中、然后插入3,2,1
问题出在哪里

20 21行,tmp要恢复原始

img

#include<iostream>
#include<string>
#include<vector>
#include<algorithm>
using namespace std;

class Solution {
public:
    vector<vector<int>> permute(int nums) {
        vector<vector<int>> res;
        vector<int> tmp;
        vector<int> numsList;
        for (int i = 1; i <= nums; i++) {
            numsList.push_back(i);
        }
        dfs(res, numsList, tmp);
        return res;
    }

    void dfs(vector<vector<int>>& res, vector<int>& numsList, vector<int>& tmp) {
        if (tmp.size() == numsList.size()) {
            res.push_back(tmp);
            return;
        }

        for (int i = 0; i < numsList.size(); i++) {
            if (find(tmp.begin(), tmp.end(), numsList[i]) == tmp.end()) {
                tmp.push_back(numsList[i]);
                dfs(res, numsList, tmp);
                tmp.pop_back();
            }
        }
    }
};

int main() {
    Solution a;
    vector<vector<int>> ok;
    ok = a.permute(5);
    for (int i = 0; i < ok.size(); i++) {
        for (int j = 0; j < 5; j++) {
            cout << ok[i][j] << " ";
        }
        cout << endl;
    }
    return 0;
}

这题是经典DFS,你可以看看我的博客,全排列问题

img


代码

#include<iostream>
#include<string>
#include<vector>
using namespace std;

class Solution {
public:
  vector<vector<int>> permute(vector<int> nums) {
    
    vector<vector<int>> res;
    dfs(res, nums.size(), {{nums}}, nums); 
    return res;

  }

  void dfs(vector<vector<int>>& res, int num, vector<vector<int>> re, vector<int> nums) { 

    if (num == 0) 
      return;

    if (num == 1) {
      for (auto v : re) {
        res.push_back(v);
      }
      return;
    }

    vector<vector<int>> peli;

    for (int j = 0; j < re.size(); j++) {
        
      vector<int> tmp = re[j];
      
      for (int i = 0; i < nums.size() - num + 1; i++) {
        tmp.insert(tmp.begin() + i, num);
        peli.push_back(tmp);
        tmp = re[j]; 
      }

    }

    dfs(res, num - 1, peli, nums); 

  }
};

int main() {

  Solution a;
  vector<vector<int>> ok;

  ok = a.permute({1,2,3,4,5});

  for (int i = 0; i < ok.size(); i++) {
    for (int j = 0; j < 5; j++) {
      cout << ok[i][j] << " ";
    }
    cout << endl;
  }

}


不知道你这个问题是否已经解决, 如果还没有解决的话:

如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^