LeetCode 【47. Permutations II】

本文介绍了一种算法,用于处理包含重复数字的集合,并返回所有可能的唯一排列组合。通过先排序数组并适当跳过重复元素的方法,有效地解决了问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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],
  [2,1,1]
]

思路1.
这题与Permutations的区别在于他允许重复数字,最简单的就是利用1的结果,保存在一个set中,去重复后保存结果,但不够理想。

思路2.

对数组先进行排序,如果有重复数字,则跳过,需要注意的是,因为排序,如果采用引用传递,则会破坏排序,所以使用值传递。当然也可以使用引用传递,但每次传递后,把交换的数据交换回来并且对后序数组再进行排序。
class Solution {
public:
    vector<vector<int>> permuteUnique(vector<int>& nums) {
        vector<vector<int>> result;
	    sort(nums.begin(),nums.end());
	    permuteRec( 0, nums, result);
	    return result;
    }

private:
    void permuteRec( int start, vector<int> nums, vector<vector<int>> &result ){
		if( start >= nums.size()){
			result.push_back(nums);
			return;
		}
		for( int i = start; i < nums.size(); i++ ){
            if( i > start && nums[i] == nums[start]) continue;
            swap( nums[start], nums[i] );
			permuteRec( start+1, nums, result);
		}
    }
};

  

转载于:https://www.cnblogs.com/rockwall/p/5762329.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值