zoukankan      html  css  js  c++  java
  • [LEETCODE31] 下一个排列

    [LEETCODE31] 下一个排列

    Description

    实现获取 下一个排列 的函数,算法需要将给定数字序列重新排列成字典序中下一个更大的排列。

    Solution

    思路上,我们希望靠左的数尽可能不动,只在靠右的一些数间进行修改。

    我们找到最大的满足 (a[i]<a[i+1])(i),找到最大的满足 (a[j]>a[i])(j),交换 (a[i],a[j]),此时 (a[i+1..n]) 仍然是降序的,我们需要反转它来将其变为升序。

    class Solution {
    public:
        void nextPermutation(vector<int>& nums) {
            int n=nums.size();
            vector<int>& a=nums;
            int i=-1;
            for(i=n-2;i>=0;--i) if(a[i]<a[i+1]) break;
            if(i==-1)
            {
                for(int i=0;i<n;i++) for(int j=0;j<i;j++) if(a[i]<a[j]) swap(a[i],a[j]);
            }
            else 
            {
                int j=n;
                for(j=n-1;j>i;j--) if(a[j]>a[i]) break;
                swap(a[i],a[j]);
                reverse(a.begin()+i+1,a.end());
            }
        }
    };
    
  • 相关阅读:
    用户模板和用户场景
    人月神话阅读笔记02
    人月神话阅读笔记01
    软件工程周总结07
    NABCD
    软件工程周总结06
    软件工程周总结05
    tomcat端口被占用
    SQLyog出现2003错
    一维最大子数组和(续)
  • 原文地址:https://www.cnblogs.com/mollnn/p/14130015.html
Copyright © 2011-2022 走看看