Middle-题目88:31. Next Permutation

原创 2016年05月31日 17:26:20

题目原文:
Implement next permutation, which rearranges numbers into the lexicographically next greater permutation of numbers.
If such arrangement is not possible, it must rearrange it as the lowest possible order (ie, sorted in ascending order).
The replacement must be in-place, do not allocate extra memory.
Here are some examples. Inputs are in the left-hand column and its corresponding outputs are in the right-hand column.
1,2,3 → 1,3,2
3,2,1 → 1,2,3
1,1,5 → 1,5,1
题目大意:
求出一个数组的下一个字典序的排序结果。
题目分析:
使用C++中的库函数next_permutation实现(在头文件algorithm中)。
函数接口:bool next_permutation( iterator start, iterator end);
即求start-end这个序列的下一个排序。
源码:(language:cpp)

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

成绩:
12ms,beats 10.04%,众数12ms,88.95%
Cmershen的碎碎念:
C++11中,Next_permutation的源码如下:

    bool _Next_permutation(_BidIt _First, _BidIt _Last, _Pr _Pred)
    {   // permute and test for pure ascending, using _Pred
    _BidIt _Next = _Last;
    if (_First == _Last || _First == --_Next)
        return (false);

    for (; ; )
        {   // find rightmost element smaller than successor
        _BidIt _Next1 = _Next;
        if (_DEBUG_LT_PRED(_Pred, *--_Next, *_Next1))
            {   // swap with rightmost element that's smaller, flip suffix
            _BidIt _Mid = _Last;
            for (; !_DEBUG_LT_PRED(_Pred, *_Next, *--_Mid); )
                ;
            _STD iter_swap(_Next, _Mid);
            _STD reverse(_Next1, _Last);
            return (true);
            }

        if (_Next == _First)
            {   // pure descending, flip all
            _STD reverse(_First, _Last);
            return (false);
            }
        }
    }

大致思路:
在当前序列中,从尾端向前寻找两个相邻元素,前一个记为*i,后一个记为*t,并且满足*i < *t。然后再从尾端寻找另一个元素*j,如果满足*i < *j,即将第i个元素与第j个元素对调,并将第t个元素之后(包括t)的所有元素颠倒排序,即求出下一个序列了。

版权声明:完整版Leetcode题解请出门左转https://github.com/cmershen1/leetcode/tree/master/docs

LeetCode 31 Next Permutation (C,C++,Java,Python)

Problem: Implement next permutation, which rearranges numbers into the lexicographically next g...
  • runningtortoises
  • runningtortoises
  • 2015年05月14日 14:36
  • 1347

31 Next Permutation

题目链接:https://leetcode.com/problems/next-permutation/题目:Implement next permutation, which rearranges ...
  • ChilseaSai
  • ChilseaSai
  • 2015年09月01日 20:51
  • 913

LeetCode 31 Next Permutation(下一个排列)

翻译实现下一个排列,将排列中的数字重新排列成字典序中的下一个更大的排列。如果这样的重新排列是不可能的,它必须重新排列为可能的最低顺序(即,升序排序)。重排必须在原地,不分配额外的内存。这里有些例子。输...
  • NoMasp
  • NoMasp
  • 2015年11月18日 22:40
  • 7218

31. Next Permutation (python)

Implement next permutation, which rearranges numbers into the lexicographically next greater permuta...
  • qq_28119401
  • qq_28119401
  • 2016年10月30日 16:17
  • 539

31. Next Permutation Leetcode Python

Implement next permutation, which rearranges numbers into the lexicographically next greater permuta...
  • hyperbolechi
  • hyperbolechi
  • 2015年01月22日 06:43
  • 508

[LeetCode]31.Next Permutation

【题目】 Implement next permutation, which rearranges numbers into the lexicographically next great...
  • SunnyYoona
  • SunnyYoona
  • 2015年01月16日 12:03
  • 1313

next_permutation原理剖析

最近刷leetcode的时候遇见next permutation这道题,感觉挺有意思的一个题目,
  • QQ575787460
  • QQ575787460
  • 2014年11月17日 20:49
  • 12999

31. Next Permutation | Java最短代码实现

原题链接:31. Next Permutation 【思路】 首先,我们来了解一下——字典序法: C++的STL库里面有nextPermutation()方法,其实现就是字典序法。 下...
  • happyaaaaaaaaaaa
  • happyaaaaaaaaaaa
  • 2016年03月24日 17:39
  • 809

Leetcode#31. Next Permutation(java)

1. 题目含义:给定一个int数组,输出其全排列中的下一个序列。例如:输入数组:2431,显然其全排列有:{1234,1243,1324,1342,2134,2143,2314,2341,2413,2...
  • u011089927
  • u011089927
  • 2016年11月05日 11:17
  • 262

(Java)LeetCode-31. Next Permutation

Implement next permutation, which rearranges numbers into the lexicographically next greater permuta...
  • u012848330
  • u012848330
  • 2016年08月01日 23:41
  • 348
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Middle-题目88:31. Next Permutation
举报原因:
原因补充:

(最多只允许输入30个字)