返回介绍

solution / 0500-0599 / 0556.Next Greater Element III / README

发布于 2024-06-17 01:03:59 字数 3152 浏览 0 评论 0 收藏 0

556. 下一个更大元素 III

English Version

题目描述

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

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

 

示例 1:

输入:n = 12
输出:21

示例 2:

输入:n = 21
输出:-1

 

提示:

  • 1 <= n <= 231 - 1

解法

方法一:双指针

class Solution:
  def nextGreaterElement(self, n: int) -> int:
    cs = list(str(n))
    n = len(cs)
    i, j = n - 2, n - 1
    while i >= 0 and cs[i] >= cs[i + 1]:
      i -= 1
    if i < 0:
      return -1
    while cs[i] >= cs[j]:
      j -= 1
    cs[i], cs[j] = cs[j], cs[i]
    cs[i + 1 :] = cs[i + 1 :][::-1]
    ans = int(''.join(cs))
    return -1 if ans > 2**31 - 1 else ans
class Solution {
  public int nextGreaterElement(int n) {
    char[] cs = String.valueOf(n).toCharArray();
    n = cs.length;
    int i = n - 2, j = n - 1;
    for (; i >= 0 && cs[i] >= cs[i + 1]; --i)
      ;
    if (i < 0) {
      return -1;
    }
    for (; cs[i] >= cs[j]; --j)
      ;
    swap(cs, i, j);
    reverse(cs, i + 1, n - 1);
    long ans = Long.parseLong(String.valueOf(cs));
    return ans > Integer.MAX_VALUE ? -1 : (int) ans;
  }

  private void swap(char[] cs, int i, int j) {
    char t = cs[i];
    cs[i] = cs[j];
    cs[j] = t;
  }

  private void reverse(char[] cs, int i, int j) {
    for (; i < j; ++i, --j) {
      swap(cs, i, j);
    }
  }
}
class Solution {
public:
  int nextGreaterElement(int n) {
    string s = to_string(n);
    n = s.size();
    int i = n - 2, j = n - 1;
    for (; i >= 0 && s[i] >= s[i + 1]; --i)
      ;
    if (i < 0) return -1;
    for (; s[i] >= s[j]; --j)
      ;
    swap(s[i], s[j]);
    reverse(s.begin() + i + 1, s.end());
    long ans = stol(s);
    return ans > INT_MAX ? -1 : ans;
  }
};
func nextGreaterElement(n int) int {
  s := []byte(strconv.Itoa(n))
  n = len(s)
  i, j := n-2, n-1
  for ; i >= 0 && s[i] >= s[i+1]; i-- {
  }
  if i < 0 {
    return -1
  }
  for ; j >= 0 && s[i] >= s[j]; j-- {
  }
  s[i], s[j] = s[j], s[i]
  for i, j = i+1, n-1; i < j; i, j = i+1, j-1 {
    s[i], s[j] = s[j], s[i]
  }
  ans, _ := strconv.Atoi(string(s))
  if ans > math.MaxInt32 {
    return -1
  }
  return ans
}

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文