46.cpp 1.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677
  1. /*
  2. * @Description:
  3. * @Version: 1.0
  4. * @Autor: zhuyijun
  5. * @Date: 2021-11-11 21:30:12
  6. * @LastEditTime: 2021-11-11 22:06:51
  7. */
  8. //全排列 回溯问题
  9. /*
  10. 给定一个不含重复数字的数组 nums ,返回其 所有可能的全排列 。你可以 按任意顺序
  11. 返回答案。
  12. 示例 1:
  13. 输入:nums = [1,2,3]
  14. 输出:[[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2],[3,2,1]]
  15. 示例 2:
  16. 输入:nums = [0,1]
  17. 输出:[[0,1],[1,0]]
  18. 示例 3:
  19. 输入:nums = [1]
  20. 输出:[[1]]
  21. */
  22. #include <bits/stdc++.h>
  23. using namespace std;
  24. //全部路径 路径全排列
  25. vector<vector<int>> res;
  26. /**
  27. * @brief
  28. *
  29. * @param nums 选择列表
  30. * @param list 路径记录在其中
  31. * 结束条件: nums中的元素全在list中
  32. */
  33. void backtrack(vector<int>& nums, vector<int>& list) {
  34. // 结束条件
  35. if (list.size() == nums.size()) {
  36. res.push_back(list);
  37. }
  38. for (int num : nums) {
  39. //排除不合法的选择
  40. auto result = find(list.begin(), list.end(), num);
  41. if (result != list.end()) {
  42. continue;
  43. }
  44. //添做选择
  45. list.push_back(num);
  46. //进入下一层决策树
  47. backtrack(nums, list);
  48. result = remove(list.begin(), list.end(), num);
  49. //取消选择
  50. list.erase(result);
  51. }
  52. }
  53. vector<vector<int>> permute(vector<int>& nums) {
  54. vector<int> list;
  55. backtrack(nums, list);
  56. return res;
  57. }
  58. //测试
  59. int main() {
  60. vector<int> nums;
  61. nums.push_back(1);
  62. nums.push_back(2);
  63. nums.push_back(3);
  64. auto res = permute(nums);
  65. for (auto result : res) {
  66. for (auto r : result) {
  67. cout << r << " ";
  68. }
  69. cout << endl;
  70. }
  71. return 0;
  72. }