当前位置: 代码迷 >> 综合 >> leetcode 46. Permutations (medium)
  详细解决方案

leetcode 46. Permutations (medium)

热度:4   发布时间:2024-01-05 00:37:33.0

题意:求排列组合的情况,并且保存下来
思路:
1.回溯法
利用递归每次往当前组合中加入一个未加入过的数字,直到组合长度满足条件时,就回溯回到上一个添加数字时,重新添加

class Solution
{public:vector<vector<int>> res;vector<vector<int>> permute(vector<int> &nums){vector<int> temp;Backtracking(temp, nums);return res;}void Backtracking(vector<int> &tempNums, vector<int> &nums){if (tempNums.size() == nums.size()){res.push_back(tempNums);}else{for (int i = 0; i < nums.size(); i++){if (find(tempNums.begin(), tempNums.end(), nums[i]) == tempNums.end()){tempNums.push_back(nums[i]);Backtracking(tempNums, nums);tempNums.pop_back();}}}}
};

2.交换法
discuss里的高票解法,很巧妙呀
基本思想:A [1…n]的排列等于

A [1] +置换(A [1…n] - A [1])

A [2] +置换(A [1…n] - A [2])

A [n] +置换(A [1…n] - A [n])。
将一个元素固定在初始位置,并尝试在所有可能的情况下更改其余元素。为了实现这一点,我们再次递归地调用相同的函数,begin+1,因为已经计算出了begin之前所在的所有可能性。同样的需要在调用相同的函数后需要回归状态

class Solution
{public:vector<vector<int>> res;vector<vector<int>> permute(vector<int> &nums){vector<int> temp;helper(0, nums);return res;}void helper(int begin, vector<int> &nums){if (begin == nums.size()){res.push_back(nums);}else{for (int i = begin; i < nums.size(); i++){swap(nums[begin], nums[i]);helper(begin + 1, nums);swap(nums[begin], nums[i]);}}}
};
  相关解决方案