LeetCode 0556.下一个更大元素 III - 4步讲完

Posted Tisfy

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了LeetCode 0556.下一个更大元素 III - 4步讲完相关的知识,希望对你有一定的参考价值。

【LetMeFly】4步讲完:556.下一个更大元素 III

力扣题目链接:https://leetcode.cn/problems/next-greater-element-iii/

给你一个正整数 n ,请你找出符合条件的最小整数,其由重新排列 n 中存在的每位数字组成,并且其值大于 n 。如果不存在这样的正整数,则返回 -1

注意 ,返回的整数应当是一个 32 位整数 ,如果存在满足题意的答案,但不是 32 位整数 ,同样返回 -1

示例 1:

输入:n = 12
输出:21

示例 2:

输入:n = 21
输出:-1

提示:

  • 1 <= n <= 231 - 1

方法一:模拟

其实就是求数字对应字符串的下一个全排列,方法也很简单(4步):

  1. 从后往前看,找到第一个“后面有大于它的数”的数(记为s[i] = x)

  2. 在s[i ~ 最后]中找到最小的大于x的数(记为s[j] = y)

  3. 交换s[i]和s[j]

  4. 在s[i+1 ~ 最后]范围内从小到大排序

然后返回字符串对应的数字即可

  • 时间复杂度 O ( N 2 ) O(N^2) O(N2),其中 N N N是数字的位数( N ≤ 10 N\\leq 10 N10
  • 空间复杂度 O ( N log ⁡ N ) O(N\\log N) O(NlogN),空间复杂度主要是排序所致

AC代码

C++

class Solution 
public:
    int nextGreaterElement(int n) 
        string s = to_string(n);
        bool changed = false;
        for (int i = s.size() - 2; i >= 0; i--) 
            char m = 58;  // '9' = 57
            int locm = i;
            for (int j = i + 1; j < s.size(); j++) 
                if (s[j] > s[i] && s[j] < m) 
                    m = s[j];
                    locm = j;
                
            
            if (locm != i) 
                changed = true;
                swap(s[i], s[locm]);
                sort(s.begin() + i + 1, s.end());
                break;
            
        
        if (!changed)
            return -1;
        ll ans = atoll(s.c_str());
        if (ans > INT_MAX)
            return -1;
        return ans;
    
;

小小记录一下嘿嘿

同步发文于CSDN,原创不易,转载请附上原文链接哦~
Tisfy:https://letmefly.blog.csdn.net/article/details/125582351

以上是关于LeetCode 0556.下一个更大元素 III - 4步讲完的主要内容,如果未能解决你的问题,请参考以下文章

Leetcode 556.下一个更大元素III

leetcode 556. 下一个更大元素 III

556. 下一个更大元素 III

每日一题556. 下一个更大元素 III

[LeetCode] 556. Next Greater Element III

字符串556. 下一个更大元素 III