47. Permutations II leetcode

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]
]

class Solution {
public:
    vector<vector<int>> vv;
    vector<vector<int>> permuteUnique(vector<int>& nums) {    // 题目开头
        fun1(nums,0);
        return vv;
        
    }
    bool Swap(vector<int>& nums,int i,int j) {               //判断容器中有没有重复元素
        int s=i;
        while(nums[s]!=nums[j]&&s<j) {
            s++;
        }
        if(s==j)
            return true;
        else
            return false;
    }
    void fun1(vector<int>& nums,int j) {
        int num1=nums.size();
        if(j>num1-1)
            vv.push_back(nums);
        else {
            for(int i=j;i<num1;i++) {
                if(!Swap(nums,j,i))           //将重复元素的排列自动跳过,从j到i
                    continue;
                swap(nums[i],nums[j]);       //交换位置
                fun1(nums,j+1);
                swap(nums[i],nums[j]);
            }
        }
    }
};
  //编译器上可运行代码

//1 2 3

/*[

 [1,2,3],

 [1,3,2],

 [2,1,3],

 [2,3,1],

 [3,1,2],

 [3,2,1]

 ]*/

#include <iostream>

#include <vector>

using namespace std;

classSolution {

public:

    vector<vector<int>> vv;

    vector<int> v;

    vector<vector<int>> fun(vector<int>& num) {//全排序1的源代码

        int n1=num.size();

        fun2(num,0);

        return vv;

    }

    void fun2(vector<int>& num,int j) {//全排序1.1

        int n2=num.size();

        if(j>n2-1)

            vv.push_back(v);

        else

        {

            for(int i=j;i<n2;i++)

            {

               v.push_back(num[i]);

               swap(num[i],num[j]);

               fun2(num,j+1);

               swap(num[i],num[j]);

               v.pop_back();

               /*for(int k=0;k<3;k++)

                    cout<<v[k]<<"";

                cout<<endl;*/

            }

        }

    }

    vector<vector<int>> fun3(vector<int>& num) {//全排序2

        fun4(num,0);

        return vv;

    }

    bool isSwap(vector<int>& num,int i,int j) {

        int s=i;

        while(num[s]!=num[j]&&s<j)

           s++;

        if(s==j)

            return true;

        else

            return false;

    }

    void fun4(vector<int>& num,int j) {//全排序2.1

        int n1=num.size();

        if(j>n1-1)

            vv.push_back(num);

        else

        {

            for(int i=j;i<n1;i++) {

               if(!isSwap(num,j, i))

                   continue;

                swap(num[i],num[j]);

               fun4(num,j+1);

               swap(num[i],num[j]);

            }

        }

    }

};

intmain() {

    Solution q;

    int t;

    vector<int> num;

    for(int i=0;i<3;i++)

    {

        cin>>t;

        num.push_back(t);

    }

    q.fun(num);

    //q.fun2(num,0);

    //int a=q.fun(num).size();

   

    //cout<<endl;

    //输出

    for(int i = 0; i < 6; i++)

    {

        for(int j = 0;j < 3; j++)

        {

            cout << q.vv[i][j] << " ";

        }

        cout << endl;

    }

    q.vv.clear();

    cout<<endl;

    q.fun3(num);

    int a=q.vv.size();

    for(int i = 0; i < a; i++)

    {

        for(int j = 0;j < 3; j++)

        {

            cout << q.vv[i][j] << " ";

        }

        cout << endl;

    }

    return 0;

}

结果显示:






  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值