Given a collection of numbers that might contain duplicates, return all possible unique permutations.
For example,[1,1,2]
have the following unique permutations:[1,1,2]
, [1,2,1]
, and [2,1,1]
.
转自 http://blog.csdn.net/morewindows/article/details/7370155/ 感谢博主
1.全排列就是从第一个数字起每个数分别与它后面的数字交换。
2.去重的全排列就是从第一个数字起每个数分别与它后面非重复出现的数字交换。
3.全排列的非递归就是由后向前找替换数和替换点,然后由后向前找第一个比替换数大的数与替换数交换,最后颠倒替换点后的所有数据。
解法一:
去重:i,j交换位置时,只和[i,j]之间没有等于nuums[j]的原素交换,并排列,如果有相等的,则跳过,因为在i到j之前的某个位置ij使nums[ij]==nums[j],并且排列过了,再排列就会产生重复。
解法二:
运用next_permutation方式,
对数组升序排列,
从后往前查找第一对A[i]<A[j]的i的下标,如果没有找到这样的i,则说明数组已经成为降序,即已经是最后一个排列了,结束
从后往前,查找比A【i]大的最小的数的下标,记为j,交换A[i],A[j],并反转[i+1,end)的数组,((从i+1,到数组末尾吖。
重复2――3,
public:
bool isSwap(vector<int> &nums, int start, int end){
for (int i = start; i<end; i++){
if (nums[i] == nums[end])
return false;
}
return true;
}
void permuteCore(vector<int> &nums, int cur, vector<vector<int> > &results){
int size = nums.size();
if (size == cur + 1){
results.push_back(nums);
}
else{
for (int i = cur; i<size; ++i){
if (isSwap(nums, cur, i))
{
swap(nums[cur], nums[i]);
permuteCore(nums, cur + 1, results);
swap(nums[cur], nums[i]);
}
}
}
}
void permuteCoreNot(vector<int> &nums, vector<vector<int> >&results){
sort(nums.begin(), nums.end());
results.push_back(nums);
int size = nums.size();
while (true){
int exchangePospre = -1, exchangePostail = -1;
for (int i = size - 2; i >= 0; i--){
if (nums[i]<nums[i + 1]){
exchangePospre = i;
break;
}
}
if (exchangePospre == -1)
break;
int maxlen = numeric_limits<int>::max();
for (int i = size - 1; i >exchangePospre; i--){
if (nums[i]>nums[exchangePospre] && (nums[i]<maxlen)){
exchangePostail = i;
maxlen = nums[i];
}
}
swap(nums[exchangePospre], nums[exchangePostail]);
reverse(nums.begin() + exchangePospre+1, nums.end());
//swap(nums[exchangePospre], nums[exchangePostail]);
results.push_back(nums);
}
}
vector<vector<int>> permuteUnique(vector<int>& nums) {
int size = nums.size();
vector<vector<int> > results;
if (size == 0)
return results;
if (size == 1)
{
results.push_back(nums);
return results;
}
//permuteCore(nums,0,results);
permuteCoreNot(nums, results);
return results;
}