题目:Given a collection of 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]
,
and [3,2,1]
.
思路:
使用回溯法,一开始先进第一个,当然最后需要弹出来,回溯的必然操作,然后,我需要和我一开始的start进行交换,因为我有许多种可能性。
其实题目隐含着第几次交换的计算,就和真正人计算排列组合时候,从左往右开始数数,选择某一个,先是和第一个交换,这个时候结束了,生成新的数组或者字符串s’,下一次交换就是对s’进行交换啦。当然是从s’的start开始,当然题目中都是用nums进行表示的,为了理解,我写成nums。
本题不算特别难。
代码:
class Solution { public: vector<vector<int>> permute(vector<int>& nums) { vector<vector<int> >result; permuteHelper(0,nums,result); return result; } void permuteHelper(int start,vector<int>& nums,vector<vector<int> >&result){ if(start==nums.size()){ result.push_back(nums); return; } for(int i=start;i<nums.size();i++){ swap(nums[i],nums[start]); permuteHelper(start+1,nums,result); swap(nums[i],nums[start]); } } };