今天状态不是很好,刷了一道正好是当时面试被问到的题目,下面就和大家分享一下经验吧!
题目如下:
Given a collection of distinct integers, return all possible permutations. Example: Input: [1,2,3] Output: [ [1,2,3], [1,3,2], [2,1,3], [2,3,1], [3,1,2], [3,2,1] ]题意分析:
给定一个包含不同整数的集合,请返回它的全排列。
方法一(递归回溯法)
与“https://blog.csdn.net/Vensmallzeng/article/details/96103159”的方法一的思路相同,不过以下几点区别:
① 在同一排列中,用过的数字不能重复使用,但在不同的排列中,用过的数字可以再次使用;
② 对于数字应该用push_back方式予以累加;
解题代码如下:
class Solution{ private: vector<vector<int>> res; vector<bool> used; void Findpermute(vector<int>& nums, int k, vector<int>& temp){ if (k==nums.size()) {res.push_back(temp); return;} for (int i = 0; i < nums.size(); i++) { if (!used[i]){ temp.push_back(nums[i]); used[i] = true; Findpermute(nums, k+1,temp); temp.pop_back(); used[i] = false; } } return; } public: vector<vector<int>> permute(vector<int>& nums){ if(nums.size()==0) return res; used = vector<bool>(nums.size(), false); vector<int> temp; Findpermute(nums, 0,temp); return res; } };提交后的结果如下:
方法二(递归交换法)
通过每次递归调用,交换nums里面的两个数字可以生成所有的排列情况。该方法写起来更简洁。
解题代码如下:
class Solution{ public: vector<vector<int>> permute(vector<int> nums) { vector<vector<int>> res; if (nums.size() == 0) return res; Findpermute(nums, 0, res); return res; } void Findpermute(vector<int> nums, int start, vector<vector<int>>& res){ if(start == nums.size()) { res.push_back(nums); return; } for (int i = start; i < nums.size(); i++) { swap(nums[start], nums[i]); Findpermute(nums, start+1, res); swap(nums[start], nums[i]); } } };提交后的结果如下:
日积月累,与君共进,增增小结,未完待续。