47. Permutations II(全排列)

给定一组可能包含重复项的数字,请返回所有可能的唯一排列。
(不能有重复的)
例:输入: [1,1,2]
输出:
[
[1,1,2],
[1,2,1],
[2,1,1]
]

思路:
首先,不能有重复的全排列。重点在于处理重复的数字部分。采用先排序的方式,将数组排好序。然后用回溯的方法,将数组从0开始,如果往后遍历有和此时的i 不相等的数字,就交换。直到到i=n-1结束,压入res数组,然后到倒数第二个开始比较了。所以就可以将数字插进相同的数字不同间隔位。
方法:回溯。
代码:

class Solution {
public:
    vector<vector<int>> permuteUnique(vector<int>& nums) {
        int len=nums.size();
        vector<vector<int>> res;
        if(len<1)
            return res;
        sort(nums.begin(),nums.end());      //先排序。
        premu(nums,0,len,res);
        return res;
    }
    
private:
    void premu(vector<int> num, int i, int j, vector<vector<int> >  &res)
    {
        if(i==j-1)
        {
            res.push_back(num);         //swap过了!直接压
            return;
        }

        for(int k=i; k<j; ++k)
        {
            if(i!=k && num[i]== num[k] )
                continue;
            std::swap(num[i],num[k]);
            
            premu(num, i+1,j,res);
        }
        return ;
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值