1. vector<vector<int>> permutation(vector<int>& nums)
vector<vector<int>>:返回类型是一个二维 vector,每个子 vector 包含一组排列。
permutation:这是类 Solution 中的成员函数,用于生成所有 nums 的排列。
vector<int>& nums:参数 nums 是一个整数向量的引用,表示输入的数列。
2. vector<vector<int>> res;
res:定义了一个二维 vector,用于存储所有的排列结果。每个 vector<int> 存储一个排列。
3. sort(nums.begin(), nums.end());
sort:对 nums 进行排序。为了确保 next_permutation 能从第一个排列开始生成所有排列,输入向量必须首先是按升序排列的。
4. do { res.push_back(nums); } while (next_permutation(nums.begin(), nums.end()));
do { ... } while (...):这是一个 do-while 循环。循环体内的代码至少执行一次,然后根据 next_permutation 的返回值决定是否继续。
res.push_back(nums);:将当前排列 nums 添加到 res 中。
next_permutation(nums.begin(), nums.end()):生成 nums 的下一个排列。如果当前排列是所有排列中的最后一个排列,函数将其重置为第一个排列,并返回 false,否则返回 true。
5. return res;
return res;:返回存储了所有排列的 res。
代码执行步骤
排序:首先对输入向量 nums 进行升序排序。这是因为 next_permutation 需要从最小的排列开始生成所有可能的排列。
生成排列:使用 do-while 循环遍历 nums 的所有排列。在每次循环中,当前的排列 nums 被添加到结果 res 中。
返回结果:当 next_permutation 返回 false 时,表示所有排列已经生成完毕,循环结束,最后返回存储所有排列的 res。
示例
假设输入是 nums = [1, 2, 3]:
排序后:nums 是 [1, 2, 3]。
生成排列:
第一轮:[1, 2, 3] 被添加到 res。
第二轮:next_permutation 生成 [1, 3, 2]。
第三轮:[1, 3, 2] 被添加到 res。
第四轮:next_permutation 生成 [2, 1, 3]。
第五轮:[2, 1, 3] 被添加到 res。
第六轮:next_permutation 生成 [2, 3, 1]。
第七轮:[2, 3, 1] 被添加到 res。
第八轮:next_permutation 生成 [3, 1, 2]。
第九轮:[3, 1, 2] 被添加到 res。
第十轮:next_permutation 生成 [3, 2, 1]。
第十一轮:[3, 2, 1] 被添加到 res。
第十二轮:next_permutation 返回 false,循环结束。
返回结果:res 包含了所有的排列:[[1, 2, 3], [1, 3, 2], [2, 1, 3], [2, 3, 1], [3, 1, 2], [3, 2, 1]]。
这样,函数 permutation 就生成了输入向量的所有排列并将它们返回。
代码:
class Solution {
public:
vector<vector<int>> permutation(vector<int>& nums) {
vector<vector<int>> res;//这是定义的二维vector数组。
sort(nums.begin(),nums.end());//这个排序别忘了。
do{
res.push_back(nums);
}while(next_permutation(nums.begin(),nums.end()));
//do-while循环是do里面的语句至少做一次,然后再while判断。
/*这个while判断是如果还有序列,那么就返回true继续运行;后面没有
序列了那就返回false终止运行。
*/
return res;
}
};