在 LeetCode 46——全排列 中咱们已经知道,全排列其实就是先肯定某一个位置的元素,而后余下就是一个子问题。在那个问题中,数据没有重复,因此数据中的任意元素均可以放在最后一个位置。数组
可是,若是数据有重复的话,重复的数据都放在最后则是同样的结果,咱们须要进行一个去重。在这里,咱们对数据先进行一个排序,而后依次把每一个数据都交换到第一个位置,若是它和第一个数据不相等的话,并且咱们不用再交换回来,最后递归求解子问题便可。code
好比数据 [1, 3, 3, 4],第一次交换为 [1, 3, 3, 4],1 为第一个元素;第二次交换为 [3, 1, 3, 4],3 为第一个元素;第三次交换时 3 和 3 相等,重复状况不交换;第四次交换为 [4, 1, 3, 3],4 为第一个元素。能够看到,这样的话第一个元素总共有三种状况,而后分别递归便可。blog
class Solution { vector<vector<int>> result; public: vector<vector<int>> permuteUnique(vector<int>& nums) { int n = nums.size(); sort(nums.begin(), nums.end()); Generate_Premutations(nums, 0, n-1); return result; } void Generate_Premutations(vector<int> nums, int left, int right) { if (left == right) { result.push_back(nums); } else { for (int i = left; i <= right; i++) { if (i != left && nums[i] == nums[left]) continue; // 交换后就再也不交换回来了,需传值而不是传引用,不然递归调用就会改变数组 swap(nums[left], nums[i]); Generate_Premutations(nums, left+1, right); } } } };
获取更多精彩,请关注「seniusen」!排序