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;
    }
};

原文地址:https://www.cnblogs.com/lqerio/p/11785894.html

时间: 2024-10-11 13:31:28

leetcode31 下一个排列 字典序的相关文章

leetcode31题:下一个排列

实现获取下一个排列的函数,算法需要将给定数字序列重新排列成字典序中下一个更大的排列. 如果不存在下一个更大的排列,则将数字重新排列成最小的排列(即升序排列). 必须原地修改,只允许使用额外常数空间. 以下是一些例子,输入位于左侧列,其相应输出位于右侧列.1,2,3 → 1,3,23,2,1 → 1,2,31,1,5 → 1,5,1 代码如下: public class Solution { public void nextPermutation(int[] nums) { int i = num

LinkCode 下一个排列、上一个排列

http://www.lintcode.com/zh-cn/problem/next-permutation-ii/# 原题 给定一个若干整数的排列,给出按正数大小进行字典序从小到大排序后的下一个排列. 如果没有下一个排列,则输出字典序最小的序列. 样例 左边是原始排列,右边是对应的下一个排列. 1,2,3 → 1,3,2 3,2,1 → 1,2,3 1,1,5 → 1,5,1 解题思路(示例:[1,3,5,4,2]) 从后开始往前遍历,找到后一个元素大于前一个元素的时候记录前一个元素的指针(也

stl 之 next_permutation 求出一个排序的下一个排列的函数 转载

这是一个求一个排序的下一个排列的函数,可以遍历全排列,要包含头文件<algorithm>下面是以前的笔记    与之完全相反的函数还有prev_permutation  (1) int 类型的next_permutation int main(){ int a[3];a[0]=1;a[1]=2;a[2]=3; do{cout<<a[0]<<" "<<a[1]<<" "<<a[2]<<

LeetCode 31 Next Permutation(下一个排列)

翻译 实现"下一个排列"函数,将排列中的数字重新排列成字典序中的下一个更大的排列. 如果这样的重新排列是不可能的,它必须重新排列为可能的最低顺序(即升序排序). 重排必须在原地,不分配额外的内存. 以下是一些示例,左侧是输入,右侧是输出: 1,2,3 → 1,3,2 3,2,1 → 1,2,3 1,1,5 → 1,5,1 原文 Implement next permutation, which rearranges numbers into the lexicographically

已知一个排列求下一个排列(NOIP2004P4 火星人 题解)转

题目描述略) 本题题意为求给定长度为 n 的数列的后第 m 个全排列(字典序). 对于一个给定的数列 a[0 .. n-1],求其下一个字典序的全排列算法如下: 从右向左查询最大的下标 i (0 ≤ i ≤ n-1) 使得 a[i] < a[i+1]: 从左向右查询最小的元素 a[j] (i+1 ≤ j ≤ n-1) 使得 a[i] < a[j]: 交换 a[i] 和 a[j]: 逆置翻转 a[i+1 .. n-1]. 算法分析:我们可以发现,第一步求出的 i 下标表示 a[i+1 .. n-

【算法题7】寻找下一个排列

来自:LeetCode 37 实现获取下一个排列的函数,算法需要将给定数字序列重新排列成字典序中下一个更大的排列. 如果不存在下一个更大的排列,则将数字重新排列成最小的排列(即升序排列). 必须原地修改,只允许使用额外常数空间. 以下是一些例子,输入位于左侧列,其相应输出位于右侧列.1,2,3 → 1,3,23,2,1 → 1,2,31,1,5 → 1,5,1 解决方案: 参见博客:Next lexicographical permutation algorithm 代码如下: 1 class

LeetCode 31. 下一个排列(Next Permutation)

题目描述 实现获取下一个排列的函数,算法需要将给定数字序列重新排列成字典序中下一个更大的排列. 如果不存在下一个更大的排列,则将数字重新排列成最小的排列(即升序排列). 必须原地修改,只允许使用额外常数空间. 以下是一些例子,输入位于左侧列,其相应输出位于右侧列. 1,2,3 → 1,3,2 3,2,1 → 1,2,3 1,1,5 → 1,5,1 解题思路 由于各个排列按照字典序排序,所以以 1,3,2 → 2,1,3为例,寻找下一个排列的步骤是: 首先找到从后往前第一个升序数对,在此例中即(1

[leetcode] 31. 下一个排列

31. 下一个排列 发现规律后很简单: 下一个排列即是要找字典序中下一个更大的排列. 如串s:1 2 3 6 5 4 2 的下一个排列是 1 2 4 2 3 5 6 我们将数字串头点即为a,尾点记作b,从右往左看找到第一个降序数字的位置记为p,如例: 1236542 a_p___b 在s[p+1~b]子串中找到>s[p]的最小点,然后与s[p]交换: 1246532 a_p___b 此时,s[p+1~b]肯定仍然满足降序排列(从右往左看是升序),然后将s[p+1~b]做下reverse即可 12

LeetCode:下一个排列【31】

LeetCode:下一个排列[31] 题目描述 实现获取下一个排列的函数,算法需要将给定数字序列重新排列成字典序中下一个更大的排列. 如果不存在下一个更大的排列,则将数字重新排列成最小的排列(即升序排列). 必须原地修改,只允许使用额外常数空间. 以下是一些例子,输入位于左侧列,其相应输出位于右侧列.1,2,3 → 1,3,23,2,1 → 1,2,31,1,5 → 1,5,1 题目分析 什么样的排列将产生下一个更大的数字呢? 观察上面这个图,我们需要将数字 a[i-1]替换为位于其右侧区域的数