• 31下一个排列


    算法推导
    如何得到这样的排列顺序?这是本文的重点。我们可以这样来分析:

    我们希望下一个数比当前数大,这样才满足“下一个排列”的定义。因此只需要将后面的「大数」与前面的「小数」交换,就能得到一个更大的数。比如 123456,将 5 和 6 交换就能得到一个更大的数 123465。
    我们还希望下一个数增加的幅度尽可能的小,这样才满足“下一个排列与当前排列紧邻“的要求。为了满足这个要求,我们需要:
    在尽可能靠右的低位进行交换,需要从后向前查找
    将一个 尽可能小的「大数」 与前面的「小数」交换。比如 123465,下一个排列应该把 5 和 4 交换而不是把 6 和 4 交换
    将「大数」换到前面后,需要将「大数」后面的所有数重置为升序,升序排列就是最小的排列。以 123465 为例:首先按照上一步,交换 5 和 4,得到 123564;然后需要将 5 之后的数重置为升序,得到 123546。显然 123546 比 123564 更小,123546 就是 123465 的下一个排列
    以上就是求“下一个排列”的分析过程。

    算法过程
    标准的“下一个排列”算法可以描述为:

    从后向前查找第一个相邻升序的元素对 (i,j),满足 A[i] < A[j]。此时 [j,end) 必然是降序
    在 [j,end) 从后向前查找第一个满足 A[i] < A[k] 的 k。A[i]、A[k] 分别就是上文所说的「小数」、「大数」
    将 A[i] 与 A[k] 交换
    可以断定这时 [j,end) 必然是降序,逆置 [j,end),使其升序
    如果在步骤 1 找不到符合的相邻元素对,说明当前 [begin,end) 为一个降序顺序,则直接跳到步骤 4

    作者:imageslr
    链接:https://leetcode-cn.com/problems/next-permutation/solution/xia-yi-ge-pai-lie-suan-fa-xiang-jie-si-lu-tui-dao-/
    来源:力扣(LeetCode)
    著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

    //不知道为什么这么做emm
    class Solution {
    public:
        void nextPermutation(vector<int>& nums) {
            int n=nums.size();
            int i=n-2;
            int j=n-1;
            int f=n-1;
            while(i>=0 && nums[i]>=nums[j])
            {
                i--;
                j--;
            }
            int k=n-1;
            if(i>=0)
            {
                while(nums[k]<=nums[i])
                {
                    k--;
                }      
                swap(nums[k],nums[i]);
            }
            while(j<f)
            {
                swap(nums[j],nums[f]);
                j++;
                f--;
            }
        }
    };

    每天进步一点点~
  • 相关阅读:
    微信公众号开发第一版
    关于AJAX
    Node——异步I/O机制
    boostrap框架学习
    less学习笔记
    this指向
    关于js作用域
    mybatis映射mapper文件的#{}和${}的区别和理解
    Eclipse国内镜像源配置
    eclipse优化加速提速,解决eclipse卡、慢的问题
  • 原文地址:https://www.cnblogs.com/libin123/p/15269630.html
Copyright © 2020-2023  润新知