Leetcode-46: Permutations

这题是经典题:

解法1:用next_permutation()。要注意next_permuation()返回bool,当permutation到最大序列的时候就返回false(要注意它还能继续迭代)。要注意不能用这个返回值来控制while()循环的结束,否则当输入vec={2,3,1}时,迭代到{3,2,1}时就结束了,前面的序列都不能显示。这里必须用factorial来控制while()循环的迭代次数。

#include <iostream>
#include <algorithm>
#include <vector>

using namespace std;

int factorial(int num) {
   int ret=1;
   for (int i=1; i<=num; i++)
       ret*=i;
   return ret;
}

vector<vector<int>> permute(vector<int>& nums) {
    vector<vector<int> > ivec;
    int i=1;
    do{
        ivec.push_back(nums);
        next_permutation(nums.begin(), nums.end());

    }while(i++ <factorial(nums.size()));

    return ivec;
}

int main()
{
    vector<int> a={0,1,-1};
    vector<vector<int> > sol;
    sol =  permute(a);

    for (auto it1=sol.begin(); it1<sol.end(); it1++) {
        for (auto it2=(*it1).begin(); it2<(*it1).end(); it2++) {
            cout<<*it2<<" ";
        }
        cout<<endl;
    }

    return 0;
}

解法2:位运算

解法3: 递归

以后补充。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值