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步):
-
从后往前看,找到第一个“后面有大于它的数”的数(记为s[i] = x)
-
在s[i ~ 最后]中找到最小的大于x的数(记为s[j] = y)
-
交换s[i]和s[j]
-
在s[i+1 ~ 最后]范围内从小到大排序
然后返回字符串对应的数字即可
- 时间复杂度 O ( N 2 ) O(N^2) O(N2),其中 N N N是数字的位数( N ≤ 10 N\\leq 10 N≤10)
- 空间复杂度 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步讲完的主要内容,如果未能解决你的问题,请参考以下文章