leetcode 556 下一个更大元素 III

题目描述

下一个更大元素 III
给定一个32位正整数 n,你需要找到最小的32位整数,其与 n 中存在的位数完全相同,并且其值大于n。如果不存在这样的32位整数,则返回-1。

示例 1:

输入: 12
输出: 21

示例 2:

输入: 21
输出: -1

思路

比如“2 2 3 6 9 8 7 4 2”
首先是要从后往前操作,从个位开始操作,变化小一点,才能找到比当前数大的最小的那个数
然后,从后往前走,只要后面的数比前面的小就一直走,走不动为止;这样,我们就走了“9 8 7 4 2”这部分,它已经是局部最大了,调整不了了;
这样,问题就变成了如何调整“6 9 8 7 4 2 ”
从9开始往后找,找到大于6的最小值7,交换6,7;
变成“7 9 8 6 4 2”
再把“9 8 6 4 2”逆转,变成“7 2 4 6 8 9”

第一次做的时候都有啥问题

边界处理要把握好
感觉每次这种处理就要出错,干脆画个图好了0.0
初始化k:
在这里插入图片描述
终止条件
在这里插入图片描述
s[k]>s[k-1]
所以循环这样写:
while(不满足终止条件){
k–;
}

特殊处理:
在这里插入图片描述
所以特殊处理这样写
if(k==0) return -1;

然后定义t为 要和k-1交换的那个坐标,那么t肯定是从k开始的
在这里插入图片描述
那么循环的终止条件是什么?
是s[t]>s[k-1]还是s[t+1]<s[k-1]?
是终止状态和非终止状态的区别!
所以是后面的!!
还有 reverse(s.begin()+k,s.end());是逆转哪一部分的?
你代入一下k=0看看就知道啦

题解

class Solution {
public:
    int nextGreaterElement(int n) {
        string s=to_string(n);
        int k=s.size()-1;
        while(k>0&&s[k-1]>=s[k]) k--;
        if(k==0) return -1;
        int t=k;
        while(t+1<s.size()&&s[t+1]>s[k-1]) t++;
        swap(s[t],s[k-1]);
        reverse(s.begin()+k,s.end());
        long long res=stoll(s);
        if(res>INT_MAX) return -1;
        return res;
    }
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值