此题是Permutations题的变形。解法也很简单,只要每个位置上不再放已经放过的数就好了。代码如下:
class Solution {
private:
void helper(vector<int>& nums, vector<vector<int>>& res, vector<int>& item, vector<bool>& ifUsed) {
if (item.size() == nums.size()) {
res.push_back(item);
return;
}
set<int> ifOccur; // 用set来控制此位置只放没有放过的数
for (int i=0; i<nums.size(); i++) {
if (!ifUsed[i] && ifOccur.find(nums[i]) == ifOccur.end()) {
ifOccur.insert(nums[i]);
ifUsed[i] = true;
item.push_back(nums[i]);
helper(nums, res, item, ifUsed);
ifUsed[i] = false;
item.pop_back();
}
}
}
public:
vector<vector<int>> permuteUnique(vector<int>& nums) {
vector<vector<int>> res;
vector<int> item;
vector<bool> ifUsed(nums.size(), false);
helper(nums, res, item, ifUsed);
return res;
}
};