给定一个不含重复数字的数组 nums
,返回其 所有可能的全排列 。你可以 按任意顺序 返回答案。
示例 1:
输入:nums = [1,2,3] 输出:[[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2],[3,2,1]]
示例 2:
输入:nums = [0,1] 输出:[[0,1],[1,0]]
示例 3:
输入:nums = [1] 输出:[[1]]
思路:
首先排列是有序的,也就是说 [1,2] 和 [2,1] 是两个集合,这和之前的子集以及组合所不同的地方。
可以看出元素1在[1,2]中已经使用过了,但是在[2,1]中还要在使用一次1,所以处理排列问题就不用使用startIndex了。
代码如下:
class Solution { private: vector<vector<int>> res; vector<int> path; void backtracking(vector<int>& nums, vector<bool> used) { if (nums.size() == path.size()) { res.push_back(path); } for (int i = 0; i < nums.size(); i++) { if (used[i]) continue; path.push_back(nums[i]); used[i] = 1; backtracking(nums, used); path.pop_back(); used[i] = 0; } } public: vector<vector<int>> permute(vector<int>& nums) { vector<bool> used(nums.size(), 0); backtracking(nums, used); return res; } };
给定一个可包含重复数字的序列 nums
,按任意顺序 返回所有不重复的全排列。
示例 1:
输入:nums = [1,1,2] 输出: [[1,1,2], [1,2,1], [2,1,1]]
示例 2:
输入:nums = [1,2,3] 输出:[[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2],[3,2,1]]
思路:
其实就是多了一个去重。
本来是想用unordered_set来去重的,但是……,算了看代码吧
代码如下:
class Solution { private: set<vector<int>> res; // unordered_set<vector<int>, VectorHasher> res; // 不能用unordered_set,因为 unordered_set 默认不支持对 vector<int> 进行哈希 // 如果一定要保持顺序,要自定义一个哈希函数: // struct VectorHasher { // size_t operator()(const vector<int>& v) const { // size_t hashValue = 0; // for (int num : v) { // hashValue = hashValue * 31 + hash<int>{}(num); // // 使用一个常数31来更新哈希值 // } // return hashValue; // } // }; vector<int> path; void backtracking(vector<int>& nums, vector<bool> used) { if (nums.size() == path.size()) res.insert(path); for (int i = 0; i < nums.size(); i++) { if (used[i]) continue; path.push_back(nums[i]); used[i] = 1; backtracking(nums, used); path.pop_back(); used[i] = 0; } } public: vector<vector<int>> permuteUnique(vector<int>& nums) { vector<bool> used(nums.size(), 0); backtracking(nums, used); return vector<vector<int>>(res.begin(), res.end()); } };
暂无评论