LeetCode刷题笔记(Permutations)

it2022-05-05  139

今天状态不是很好,刷了一道正好是当时面试被问到的题目,下面就和大家分享一下经验吧!

题目如下:

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

提交后的结果如下: 

 

 

 

日积月累,与君共进,增增小结,未完待续。


最新回复(0)