LeetCode:Next Permutation

简介:

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


步骤如下:

  • 从最尾端开始往前寻找两个相邻的元素,两者满足i < ii(令第一个元素为i,第二个元素为ii)
  • 如果没有找到这样的一对元素则,表明当前的排列是最大的,没有下一个大的排列
  • 如果找到,再从末尾开始找出第一个大于i的元素,记为j                                  本文地址
  • 交换元素i, j,再将ii后面的所有元素颠倒排列(包括ii)
  • 如果某个排列没有比他大的下一个排列(即该排列是递减有序的),调用这个函数还是会把原排列翻转,即得到最小的排列
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
class  Solution {
public :
     void  nextPermutation(vector< int > &num) {
         int  n = num.size();
         if (n == 1) return ;
         for ( int  i = n-2, ii = n-1; i >= 0; i--,ii--)
             if (num[i] < num[ii])
             {
                 int  j = n-1;
                 while (num[j] <= num[i])j--; //从尾部找到第一个比num[i]大的数,一定可以找到
                 swap(num[i], num[j]);
                 reverse(num.begin()+ii, num.end());
                 return ;
             }
         reverse(num.begin(), num.end());
     }
};

 

STL中还提供了一个prev_permutation,可以参考我的另一篇博客:here






本文转自tenos博客园博客,原文链接:http://www.cnblogs.com/TenosDoIt/p/3770126.html,如需转载请自行联系原作者

目录
相关文章
|
8月前
|
存储 算法
【LeetCode力扣】单调栈解决Next Greater Number(下一个更大值)问题
【LeetCode力扣】单调栈解决Next Greater Number(下一个更大值)问题
65 0
LeetCode 116. Populating Next Right Pointers
给定一颗二叉树,填充每一个节点的next指针使其指向右侧节点。 如果没有下一个右侧节点,则下一个指针应设置为NULL。
89 0
LeetCode 116. Populating Next Right Pointers
LeetCode 60. Permutation Sequence
集合[1,2,3,...,n]总共包含n的阶乘个独特的排列。
78 0
LeetCode 60. Permutation Sequence
LeetCode之Next Greater Element I
LeetCode之Next Greater Element I
91 0
LeetCode - 31. Next Permutation
31. Next Permutation Problem's Link  ---------------------------------------------------------------------------- Mean:  给定一个数列,求这个数列字典序的下一个排列.
831 0
|
4月前
|
Unix Shell Linux
LeetCode刷题 Shell编程四则 | 194. 转置文件 192. 统计词频 193. 有效电话号码 195. 第十行
本文提供了几个Linux shell脚本编程问题的解决方案,包括转置文件内容、统计词频、验证有效电话号码和提取文件的第十行,每个问题都给出了至少一种实现方法。
LeetCode刷题 Shell编程四则 | 194. 转置文件 192. 统计词频 193. 有效电话号码 195. 第十行