leetcode31 下一个排列 字典序
Posted Erio
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了leetcode31 下一个排列 字典序相关的知识,希望对你有一定的参考价值。
数字的字典序就是比大小
先想几个例子 123_>132 1243-> 1324 ,12453-> 12534
1.不可排的序列就是降序序列
2.两个相同长度的串比大小,前面相同,比较第一个长度不同的字符,且越靠后越是比原来串大的小串
因为降序已经不可再排,并且字符越靠后影响越小,于是找到降序序列左侧第一个数字(最靠后)A[i],因为要整体字典序变大就与降序序列中刚好比他大的数字交换
此时得到的字典序比原来大,但是并不是最小的。重新排列A[i+1]--A[len-1],升序排列。这样得到比原来串大的最小串。
于是
1.倒着找到A[i]
2.二分找到要交换的数字
3.交换,重拍
class Solution { public: void nextPermutation(vector<int>& nums) { if (nums.size() > 1) { int i; for (i = nums.size() - 2; i > 0 && nums[i] >= nums[i+1]; i--); if(i==0&&nums[i]>=nums[i+1]){ reverse(nums.begin(), nums.end()); return; } reverse(nums.begin() + i+1, nums.end()); auto it = upper_bound(nums.begin() + i+1, nums.end(), nums[i]); swap(nums[i], *it); } return; } };
以上是关于leetcode31 下一个排列 字典序的主要内容,如果未能解决你的问题,请参考以下文章
Leetcode练习(Python):数组类:第31题:实现获取下一个排列的函数,算法需要将给定数字序列重新排列成字典序中下一个更大的排列。 如果不存在下一个更大的排列,则将数字重新排列成最小的排列