返回

为你揭秘:征服 LeetCode 556. 下一个更大元素 III 的奥秘

后端

在算法竞赛的世界里,LeetCode 556. 下一个更大元素 III 犹如一道充满智力挑战的高墙,横亘于众多编程爱好者面前。它考验着人们的模拟与双指针技巧,只有掌握了这些技巧,才能在这道难题中披荆斩棘,脱颖而出。

一、题目概述:下一个更大元素 III 的挑战

给你一个正整数 n,请你找出符合条件的最小整数,其由重新排列 n 的各位数字组成,且满足以下条件:

  • 它比 n 大。
  • 它是由 n 的各位数字重新排列而成的。

例如,给出 n = 1234,重新排列它的各位数字可以得到 $2134, 2314, 2341, 2413, 2431, 3124, 3142, 3214, 3241, 3412, 3421, 4123, 4132, 4213, 4231, 4312, 4321。这些排列中比 n 大的数字是 $2134, 2314, 2341, 3124, 3142, 3214, 3241, 4123, 4132, 4213, 4231, 4312, 4321。所以,下一个更大的元素是 $2134$。

二、解题思路:精妙的模拟与双指针协同作战

要解决 LeetCode 556. 下一个更大元素 III 的难题,我们需要借助模拟与双指针的组合技巧。首先,我们将 n 的各位数字按照从小到大的顺序排列,得到一个有序数组。然后,从有序数组的末尾开始,寻找第一个比 n 的最后一位数字大的数字。如果找到,则将其与 n 的最后一位数字交换位置,然后将 n 的各位数字从交换位置的下一个数字开始,按照从小到大的顺序重新排列。如果找不到,则表示 n 是由各位数字组成的最大数,此时需要对 n 的各位数字进行循环移位,使其变成最小的数。

三、代码实现:一步步构建解题利器

def next_greater_element(n):
    # 将 n 的各位数字按照从小到大的顺序排列
    digits = list(str(n))
    digits.sort()

    # 从有序数组的末尾开始,寻找第一个比 n 的最后一位数字大的数字
    i = len(digits) - 1
    while i > 0 and digits[i] <= digits[i - 1]:
        i -= 1

    # 如果找到,则将其与 n 的最后一位数字交换位置
    if i > 0:
        digits[i], digits[i - 1] = digits[i - 1], digits[i]

    # 将 n 的各位数字从交换位置的下一个数字开始,按照从小到大的顺序重新排列
    digits[i:] = sorted(digits[i:])

    # 将 digits 重新组合成一个整数
    next_greater_element = int(''.join(digits))

    # 如果找不到,则表示 n 是由各位数字组成的最大数,此时需要对 n 的各位数字进行循环移位,使其变成最小的数
    if next_greater_element == n:
        digits.sort()
        digits[0], digits[-1] = digits[-1], digits[0]
        next_greater_element = int(''.join(digits))

    return next_greater_element


# 测试代码
n = 1234
print(next_greater_element(n))  # 2134

四、结语:在 LeetCode 的挑战中不断成长

LeetCode 556. 下一个更大元素 III 是一道极具挑战性的题目,但只要掌握了模拟与双指针的技巧,并将其巧妙地结合起来,就能轻松征服它。在算法竞赛的旅途中,不断挑战自己,不断磨砺自己的解题技巧,终将成为算法大师。