LeetCode(31)--Next Permutation

来源:互联网 发布:登录无限极网络 编辑:程序博客网 时间:2024/06/05 07:31

就是将这个数组排列成下一个较大的数,如果已经是最大的了,就排列成最小的数。
我是这么想的,从后往前遍历数组,如果一直是逐渐增大的,则已经是最大的了,如果出现了一个下降的数,那么遍历就到此为止,因为这已遍历的部分就可以排列成下一个较大的数了
当找到这个突然下降的点A后,由于它后面已经排列为“最大”,即从前往后一直变小,所以应该从后面比A大的数中找最小的点B,然后A和B交换位置。这个时候以B开头,后面也是最大的排列,由于需要找下一个较大的数,应该把B后面的排列改为最小的,只需要将后面的数组顺序逆转一下即可。如果一直没有找到下降的点,则全部逆转即可。
举个例子:
6 5 4 8 7 5 1

首先肯定从后面开始看,1和5调换了没有用。7、5和1调换了也没有效果,因此而发现了8、7、5、1是递减的。如果想要找到下一个排列,找到递增的位置是关键。因为在这里才可以使其增长得更大。于是找到了4,显而易见4过了是5而不是8或者7更不是1。因此就需要找出比4大但在这些大数里面最小的值,并将其两者调换。那么整个排列就成了:6 5 5 8 7 4 1然而最后一步将后面的8 7 4 1做一个递增。

代码实现如下:

class Solution {public:    void nextPermutation(vector<int>& nums) {        if (nums.empty()||nums.size()==1)return;        int len = nums.size();        int i = 0;        for (i = len - 1; i > 0; i--)        {            //找到中间突然下降的点A            if (nums[i - 1] >= nums[i])continue;            else{                //找到后面比A大的数字中最小的B                for (int j = len - 1; j >= i; j--)                {                    if (nums[j] <= nums[i - 1])continue;                    else{                        int temp = nums[i - 1];                        nums[i - 1] = nums[j];                        nums[j] = temp;                    }                    break;                }            }            break;        }        sort(nums.begin()+i, nums.end());    }};
原创粉丝点击