zoukankan      html  css  js  c++  java
  • 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

    下一个排列。c++stl中有个一个现成的算法,基本思路就是从后往前找到最大的排列a[i] a[i+1] ...a[n] ,什么是最大的排列呢,假设排列a0 a1 a2 a3 a4 a5,如果ao<a1 && a1 >=  a2 >= a3 >= a4 >=a5,那么a1 a2 a3 a4 a5就是最大的排列。同时最大排列代表的含义就是,以a[i-1]开头的排列已经排完了,下一个排列应该是从a[i] a[i+1]..a[n]中找到最小的大于a[i-1]的数,然后把其与a[i-1]交换一下,再把a[i] a[i+1]..a[n]反转就可以了。

    class Solution {
    public:
        void nextPermutation(vector<int>& nums) {
            int numsSize = nums.size();
            int i=numsSize-1,j=i-1;
            while(j>=0 && nums[i]<= nums[j]){
                i=j;j-=1;
            }
            i = numsSize-1;
            cout<<"j="<<j<<endl;
            while(j>=0 && i>=0 && nums[i]<= nums[j]){
                i--;
            }
            cout<<"i="<<i<<endl;
            if(j>=0){
                swap(nums[i],nums[j]);
                reverse(nums.begin()+j+1,nums.end());
            }else{
                reverse(nums.begin(),nums.end());
            }
        }
    };
  • 相关阅读:
    misc子系统
    Spring boot+RabbitMQ环境
    Linux input
    lnmp环境的搭建
    DDD的.NET开发框架
    【踩坑记】从HybridApp到ReactNative
    Migrating from IntelliJ Projects
    Windows下Redis中RedisQFork位置调整
    远程仓库版本回退方法 good
    maven repository
  • 原文地址:https://www.cnblogs.com/zengzy/p/4964207.html
Copyright © 2011-2022 走看看