week6
题目
Given a collection of distinct numbers, return all possible permutations.
For example,
[1,2,3] have the following permutations:
[
[1,2,3],
[1,3,2],
[2,1,3],
[2,3,1],
[3,1,2],
[3,2,1]
]
原题地址:https://leetcode.com/problems/permutations/description/
解析
题意比较明确,给定一个数组,找出该数组中元素的所有排列组合。
由于不知道数组的长度,因此不可能用多重循环解决,递归应该是解决问题的一种有效方法。
大致思路为用循环依次选定数组中的每一元素作为首位,剩下的元素组成数组,再在新组成的数组中循环选定首位,如此递归,直至剩下的数组只包含一个元素。
代码
class Solution {
public:
vector<vector<int>> permute(vector<int>& nums) {
vector<vector<int>> result;
recursivePermute(nums, result, 0);
return result;
}
void recursivePermute(vector<int> &nums, vector<vector<int>> &result, int pos) {
/*剩余数组的首位与原数组相同,即数组中只剩余一位未选中*/
if (pos >= nums.size()) {
result.push_back(nums);
}
else {
/*循环选定剩余部分的首位*/
for (int i = pos; i < nums.size(); ++i) {
swap(nums[pos], nums[i]);
recursivePermute(nums, result, pos + 1);
/*将数组重置为上一步的状态*/
swap(nums[pos], nums[i]);
}
}
}
/*交换函数*/
void swap(int &a, int &b) {
int temp = a;
a = b;
b = temp;
}
};