数组(12):leetcode 中的排列问题

31.Next Permutation ,解法见上一篇博客;
46.全排列
描述:

Given a collection of distinct numbers, return all possible permutations.

For example,
[1,2,3] have the following permutations:
[1,2,3], [1,3,2], [2,1,3], [2,3,1], [3,1,2], and [3,2,1].

解法:
还是用下一个排列的思想,把每一个的下一个排列一次求出就是全排列

class Solution {  
public:  
    vector<vector<int>> permute(vector<int>& nums) {  
        int col=nums.size();  
        int row=1;  
        for(int i=1;i<=col;i++)//求阶乘  
            row*=i;  
        vector< vector<int> >  result(row);       
        for(int i=0;i < row ;i++)       
            result[i].resize(col);//设置数组的大小row行,col列  
        if(nums.empty())  
            return result;  
        vector<int> tmpnums=nums;  
        sort(tmpnums.begin(),tmpnums.end());//先排序  
        result[0]=tmpnums;  
        for(int i=1;i<row;i++)  
        {  
            next_permutation(tmpnums.begin(), tmpnums.end());  
            result[i]=tmpnums;  
        }    
        return result;  
    }  
};  

47。全排列2
描述:

给定一个可包含重复数字的序列,返回所有不重复的全排列。

示例:

输入: [1,1,2]
输出:
[
  [1,1,2],
  [1,2,1],
  [2,1,1]
]

分析:
还是用下一个排列的思想,即使有重复数,求法不变;

代码:

class Solution {  
public:  
    vector<vector<int>> permuteUnique(vector<int>& nums) {  
       sort(nums.begin(),nums.end()); //排序,第一个序列必须有序   
       vector<int> tmpnums=nums;    
       vector< vector<int> > result;    
       result.push_back(nums); //没有计算有多少个序列   
       while(true)    
       {    
           next_permutation(tmpnums.begin(), tmpnums.end());  
           if(tmpnums==nums)//说明求完了  
                break;  
           result.push_back(tmpnums);  //原来一行一行的压入数据可以这样!!!  
       }    

       return result;   
    }  
};  

60 . Permutation Sequence
描述:

给出集合 [1,2,3,…,n],其所有元素共有 n! 种排列。

按大小顺序列出所有排列情况,并一一标记,当 n = 3 时, 所有排列如下:

"123"
"132"
"213"
"231"
"312"
"321"
给定 nk,返回第 k 个排列。

说明:

给定 n 的范围是 [1, 9]。
给定 k 的范围是[1,  n!]。
示例 1:

输入: n = 3, k = 3
输出: "213"
示例 2:

输入: n = 4, k = 9
输出: "2314"

分析:
简单的,用暴力枚举的方法,调用k-1次下一个排列的函数,把前k个排列全求出来

代码

class Solution {  
public:  
    void next_permutation(string& nums) {      
            if(nums.empty() || nums.size()==1)      
                return;      
            string::iterator ite1=nums.end()-1;      
            for(;;)      
            {      
                string::iterator ite2=ite1;      
                ite1--;      
                if(*ite1 < *ite2)      
                {      
                    string::iterator itej=nums.end();      
                    while(!(*ite1 < *--itej));      
                    iter_swap(ite1,itej);      
                    reverse(ite2,nums.end());      
                    return;      
                }      

                if(ite1==nums.begin())      
                {       
                   reverse(nums.begin(),nums.end());      
                   return;      
                }      
            }      
        }   
    string getPermutation(int n, int k) {  
        string result(n,'0');  
        for(int i=1;i<=n;i++)  
            result[i-1]=i+'0';  
        for(int i=0;i<k-1;i++)//执行k-1次  
           next_permutation(result);  
        return result;     
    }  
};  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值