好像相对于全排列唯一的不同就是包含了重复元素,这样的话会与原题有什么区别呢?
明明每次都选择了不同的元素,但是因为有元素相同,所以最终的结果却出现了重复值
然后因为这里是在意序列顺序、定长的,所以不能像之前做组合一样,直接从后面选、或者排序再从后面选什么的
这里用排序+交换?我尝试这么写了,但是很明显就出问题了,这俩不能同时用,因为交换会破坏原本的有序序列
用交换的本意是省去对于已经选择元素的标记
class Solution {
vector<vector<int>> ans;
public:
vector<vector<int>> permuteUnique(vector<int>& nums) {
sort(nums.begin(), nums.end());
perm(nums, 0, nums.size() - 1);
return ans;
}
void perm(vector<int> nums, int left, int right) {
if (left == right)
ans.push_back(nums);
else {
for (int i = left; i <= right; i++) {
if (i != left && nums[left] == nums[i]) continue; # 去重
swap(nums[left], nums[i]);
perm(nums, left + 1, right);
}
}
}
};
这是别人的答案,我看不明白
我甚至不确定这还是不是回溯