[leetcode] 556. Next Greater Element III

博客围绕给定32位正整数n,求由其数字重排后比n大的最小32位整数展开。分析得出先从后往前找第一个小于右边位数的数字,再从后往前找第一个大于该数字的数交换,之后将转折点后的数字升序排列,最后防止越界转为长整型并判断结果。

Description

Given a positive 32-bit integer n, you need to find the smallest 32-bit integer which has exactly the same digits existing in the integer n and is greater in value than n. If no such positive 32-bit integer exists, you need to return -1.

Example 1:

Input: 12
Output: 21

Example 2:

Input: 21
Output: -1

分析

题目的意思是:给你一个数,然后把数字拆成单个的数,求能够组成的下一个比这个数大一点的数,没有就返回-1。

  • 比如12443322,这个数字的重排序结果应该为13222344,如果我们仔细观察的话会发现数字变大的原因是左数第二位的2变成了3,细心的童鞋会更进一步的发现后面的数字由降序变为了升序,这也不难理解,因为我们要求刚好比给定数字大的排序方式。那么我们再观察下原数字,看看2是怎么确定的,我们发现,如果从后往前看的话,2是第一个小于其右边位数的数字,因为如果是个纯降序排列的数字,做任何改变都不会使数字变大,直接返回-1。知道了找出转折点的方法,再来看如何确定2和谁交换,这里2并没有跟4换位,而是跟3换了,那么如何确定的3?其实也是从后往前遍历,找到第一个大于2的数字交换,然后把转折点之后的数字按升序排列就是最终的结果了。最后记得为防止越界要转为长整数型,然后根据结果判断是否要返回-1即可。
  • stoll: Convert string to long long

代码

class Solution {
public:
    int nextGreaterElement(int n) {
        string s=to_string(n);
        int m=s.length();
        int left=0;
        for(int i=m-1;i>0;i--){
            if(s[i]>s[i-1]){
                left=i-1;
                break;
            }
        }
        for(int i=m-1;i>0;i--){
            if(s[i]>s[left]){
                swap(s[i],s[left]);
                sort(s.begin()+left+1,s.end());
                break;
            }
        }
        long long res=stoll(s);
        if(res==n){
            return -1;
        }
        return res> INT_MAX ? -1:res;
    }
};

参考文献

[LeetCode] Next Greater Element III 下一个较大的元素之三

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

农民小飞侠

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值