一二三四五 上山打老虎

下一个排序

题目链接:https://leetcode.cn/problems/next-permutation/
变式题目链接:https://leetcode.cn/problems/next-greater-element-iii/
思路一:查找当前数值的下一个排序,相当于从个位起找到一个高位数值大于低位的数值,将其交换得到一个比当前数值大的排序,然后将求得的高位到低位之间的数递减排序,得到当前数值的下一个排序(大于当前数值的最小的由原数值元素排序得到的数)
将数值转为数组方便处理,使用INT_MAX得到最大的32位整数。此种思路时间复杂度为\(O(n^2)\)
优化后的思路二:从个位数开始双指针遍历找到高位中的较小数位置为i,其中nums[i]>nums[i+1],然后再从低位找到较大于nums[i]的数值与其交换,构造较大于原数值的数,由于i~n-1之间为顺序排列,只需要reverse达到递增排序效果。
下一个排序 代码(使用思路二): 通过while循环更方便写找到对应位置的代码

class Solution {
public:
    void nextPermutation(vector<int>& nums) {
        int l=nums.size()-2;
        while(l>=0&&nums[l]>=nums[l+1])l--;
        int i=nums.size()-1;
        if(l>=0){
            while(i>=0&&nums[i]<=nums[l])i--;
            if(i>=0)
            swap(nums[i],nums[l]);
        }
        // cout<<l<<" "<<i<<endl;
        reverse(nums.begin()+l+1,nums.end());
                return ;

    }
};

下一个更大元素Ⅲ 代码(使用思路一):

class Solution {
public:
    int nextGreaterElement(int n) {
        int a[10];
        int t=n;
        int i=0;
        while(t){
            a[i++]=t%10;
            t/=10;
        }
        function<bool(int,int)> cmp=[&](int a,int b){
            return a>b;
        };
        bool f=true;
        for(int j=0;j<i;j++)
            {
                if(f){
                for(int k=0;k<j;k++)
                if(a[k]>a[j]){
                    swap(a[k],a[j]);
                    f=false;
                    sort(a,a+j,cmp);
                    break;
                }
                }
            }
        // for(int j=0;j<i;j++)cout<<a[j]<<" ";
        // for(int j=0;j<i;j++)cout<<a[j]<<" ";
        long long num=0;
        for(int j=i-1;j>=0;j--)
        num=a[j]+num*10;
        // cout<<num<<endl;
        if(num<=n||num>INT_MAX)return -1;
        else return num;
    }
};
posted @ 2022-07-04 07:13  abestxun  阅读(25)  评论(0编辑  收藏  举报