C++ 中的下一个更大元素 III


假设我们有一个正的 32 位整数 n,我们需要找到一个最小的 32 位整数,该整数恰好包含整数 n 中存在的相同数字,并且其值大于 n。如果没有这样的正 32 位整数,则返回 -1。

所以如果数字是 213,那么结果将是 231。

为了解决这个问题,我们将遵循以下步骤:

  • s := n 作为字符串,sz := s 的大小,ok := false
  • 对于 i 从 sz – 2 到 0 的范围
    • 如果 s[i] < s[i + 1],则 ok := true 并中断循环
  • 如果 ok 为 false,则返回 – 1
  • smallest := i,curr := i + 1
  • 对于 j 从 i + 1 到 sz – 1 的范围
    • 如果 s[j] > s[smallest] 且 s[j] <= s[curr],则 curr := j
  • 交换 s[smallest] 和 s[curr]
  • aux := 从索引 0 到 smallest 的 s 的子字符串
  • 反转 aux
  • ret := 从索引 0 到 smallest + aux 的 s 的子字符串
  • 如果 ret > 32 位正整数范围,则返回 -1,否则返回 ret

让我们看看下面的实现来更好地理解:

示例

 在线演示

#include <bits/stdc++.h>
using namespace std;
class Solution {
   public:
   int nextGreaterElement(int n) {
      string s = to_string(n);
      int sz = s.size();
      int i;
      bool ok = false;
      for(i = sz - 2; i >= 0; i--){
         if(s[i] < s[i + 1]) {
            ok = true;
            break;
         }
      }
      if(!ok) return -1;
      int smallest = i;
      int curr = i + 1;
      for(int j = i + 1; j < sz; j++){
         if(s[j] > s[smallest] && s[j] <= s[curr]){
            curr = j;
         }
      }
      swap(s[smallest], s[curr]);
      string aux = s.substr(smallest + 1);
      reverse(aux.begin(), aux.end());
      string ret = s.substr(0, smallest + 1) + aux;
      return stol(ret) > INT_MAX ? -1 : stol(ret);
   }
};
main(){
   Solution ob;
   cout << (ob.nextGreaterElement(213));
}

输入

213

输出

231

更新于:2020年5月4日

189 次浏览

开始你的职业生涯

完成课程获得认证

开始
广告
© . All rights reserved.