46.全排列II
给定一个没有重复数字的序列,返回其所有可能的全排列。
示例:
输入: [1,2,3]
输出:
[
[1,2,3],
[1,3,2],
[2,1,3],
[2,3,1],
[3,1,2],
[3,2,1]
]
思想: 回溯。 不需要额外的vector来存放,只需要在num里面改变顺序,并压入输出的列表中。 num里面的顺序:将首元素与之后的每一个元素交换(让每个元素都成为一次首元素),然后首元素后移一位。
class Solution {
public:
vector<vector<int>> sb;
vector<vector<int>> permute(vector<int>& nums) {
buhuiqumingi(nums,0,nums.size()-1);
return sb;
}
void buhuiqumingi(vector<int> nums,int left, int right){
if(left==right)
{
sb.push_back(nums);
return;
}
for(int i=left;i<=right;i++){
swap(nums[left],nums[i]);
buhuiqumingi(nums,left+1,right);
}
}
};
47.全排列II
给定一个可包含重复数字的序列,返回所有不重复的全排列。
示例:
输入: [1,1,2]
输出:
[
[1,1,2],
[1,2,1],
[2,1,1]
]
思想:如上一题。但是要注意不能有重复。 只需要将num进行排序,在后面交换顺序时,如果后元素与首元素相同,则跳过,每一次互换位置,后面的序列还是有序的。
code:
class Solution {
public:
vector<vector<int>> sb;
vector<vector<int>> permuteUnique(vector<int>& nums) {
sort(nums.begin(),nums.end());
buhuiqumingzi(nums,0,nums.size()-1);
return sb;
}
void buhuiqumingzi(vector<int> nums,int left,int right){
if(left==right){
sb.push_back(nums);
return;
}
for(int i=left;i<=right;i++){
if(i!=left && nums[left]==nums[i]){
continue;
}
swap(nums[i],nums[left]);
buhuiqumingzi(nums,left+1,right);
}
}
};