Given an array nums of distinct integers, return all the possible permutations. You can return the answer in any order.
Example:
// Input: nums = [1,2,3]
// Output: [[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2],[3,2,1]]
void solve(vector<int> &nums, vector<vector<int>> &ans, int i)
{
if (i == nums.size())
{
ans.push_back(nums);
return;
}
for (int j = i; j < nums.size(); j++)
{
swap(nums[i], nums[j]);
solve(nums, ans, i + 1);
swap(nums[i], nums[j]);
}
}
vector<vector<int>> permute(vector<int> &nums)
{
vector<vector<int>> ans;
solve(nums, ans, 0);
return ans;
}
Given a collection of numbers, nums, that might contain duplicates, return all possible unique permutations in any order.
Example:
// Input: nums = [1,2,3]
// Output: [[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2],[3,2,1]]
void solve(vector<int> &nums, vector<vector<int>> &ans, int i)
{
if (i == nums.size())
{
ans.push_back(nums);
return;
}
unordered_set<int> seen;
for (int j = i; j < nums.size(); j++)
{
if (seen.count(nums[j]))
continue;
seen.insert(nums[j]);
swap(nums[i], nums[j]);
solve(nums, ans, i + 1);
swap(nums[i], nums[j]);
}
}
vector<vector<int>> permuteUnique(vector<int> &nums)
{
vector<vector<int>> ans;
solve(nums, ans, 0);
return ans;
}