LC-31. 下一个排列(贪心)

Posted Harris-H

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了LC-31. 下一个排列(贪心)相关的知识,希望对你有一定的参考价值。

LC-31. 下一个排列(贪心)

显然要尽可能交换靠右的数,用一个较小的交换右边的一个较大的。因此我们可以从右往左找到第一个满足 a [ i ] < a [ i + 1 ] a[i]<a[i+1] a[i]<a[i+1]的位置 i i i,然后在 [ i + 1 , n ) [i+1,n) [i+1,n)中找到最小的大于 a [ i ] a[i] a[i]的位置 j j j,即 a [ i ] < a [ j ] a[i]<a[j] a[i]<a[j],然后交换 a [ i ] , a [ j ] a[i],a[j] a[i],a[j],再对 [ i + 1 , n ) [i+1,n) [i+1,n)从小到大排序,也就是翻转一下即可。

时间复杂度: O ( n ) O(n) O(n)

另一个方法就是直接调用 n e x t _ p e r m u t a t i o n next\\_permutation next_permutation函数。

class Solution {
public:
    void nextPermutation(vector<int>& nums) {
         int n= nums.size();
         int i = n - 2;
         while(i >= 0 && nums[i] >= nums[i+1] ) i--;
         if( i >= 0 ){
             int j = n - 1;
             while(j >= 0 && nums[j] <= nums[i] ) j--;
             swap(nums[i], nums[j]);
         }
         reverse(nums.begin()+i+1,nums.end());
    }
};

因为全排列的复杂度是: O ( n ! ) O(n!) O(n!),均摊下来 n e x t _ m u t a t i o n next\\_mutation next_mutation的复杂度是 O ( 1 ) O(1) O(1),当然最坏是 O ( n ) O(n) O(n)

以上是关于LC-31. 下一个排列(贪心)的主要内容,如果未能解决你的问题,请参考以下文章

[Mdfs] lc剑指 Offer 38. 字符串的排列(全排列+枚举顺序+组合类型枚举+知识理解+模板题)

uva 10570Meeting with Aliens(算法效率--暴力+贪心)

牛客-[NOIP1998]拼数——贪心或暴力的求排列

html 将以编程方式附加外部脚本文件的javascript代码片段,并按顺序排列。用于响应式网站,其中ma

Contig|scaffold|N50|L50|NG50|贪心算法|de bruiji graph|

[bzoj5289][Hnoi2018]排列——贪心+堆