Leetcode 31 next_permutation 使用

思路:全排列,调用STL的 next_permutation

//备注:认为太简单太随意的可以去看下源代码

class Solution {
public:
    void nextPermutation(vector<int>& nums) {
      next_permutation(nums.begin(), nums.end());
    }
};

//STL 中实现的源代码

template <class _BidirectionalIter>
bool prev_permutation(_BidirectionalIter __first, _BidirectionalIter __last) {
  __STL_REQUIRES(_BidirectionalIter, _BidirectionalIterator);
  __STL_REQUIRES(typename iterator_traits<_BidirectionalIter>::value_type,
                 _LessThanComparable);
//从此处往后看就行了
  if (__first == __last)
    return false;
  _BidirectionalIter __i = __first;
  ++__i;
  if (__i == __last)
    return false;
  __i = __last;
  --__i;

  for(;;) {
    _BidirectionalIter __ii = __i;
    --__i;
    if (*__ii < *__i) {               //找到了第一对ii<i的元素
      _BidirectionalIter __j = __last;
      while (!(*--__j < *__i))        //找j
        {}
      iter_swap(__i, __j);            //交换i和j
      reverse(__ii, __last);          //逆转[ii,last)内的所有元素
      return true;
    }
    if (__i == __first) {             //搜索到了序列头仍然找不到这样的i,说明当前序列是全排列中的第一个排列
      reverse(__first, __last);       //将当前序列逆转,并返回false
      return false;
    }
  }
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值