LeetCode 556. 下一个更大元素 III

题目描述

🔥 556. 下一个更大元素 III

思路分析

要找出下一个更大的整数,可以按照以下步骤来解决这个问题:

  1. 从右到左遍历数字,找到第一个不符合升序顺序的数字,记为 i
  2. 如果找不到这样的数字,表示当前整数已经是最大的,无法找到更大的整数,返回 -1。
  3. 否则,再次从右到左遍历数字,找到第一个大于 i 的数字,记为 j
  4. 交换数字 ij
  5. 对数字 i 右侧的数字进行升序排序,以获得下一个更大的整数。

参考代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
func nextGreaterElement(n int) int {
	nums := []rune(strconv.Itoa(n))
	if len(nums) < 2 {
		return -1
	}

	i := len(nums) - 2

	// 找到第一个不符合升序顺序的数字
	for i >= 0 && nums[i] >= nums[i+1] {
		i--
	}

	if i < 0 {
		return -1 // 整数已经是最大的,无法找到更大的整数
	}

	j := len(nums) - 1

	// 找到第一个大于 nums[i] 的数字
	for nums[j] <= nums[i] {
		j--
	}

	// 交换数字 i 和 j
	nums[i], nums[j] = nums[j], nums[i]

	// 对数字 i 右侧的数字进行升序排序
	left, right := i+1, len(nums)-1
	for left < right {
		nums[left], nums[right] = nums[right], nums[left]
		left++
		right--
	}

	res, err := strconv.Atoi(string(nums))
	if err != nil || res > math.MaxInt32 {
		return -1
	}

	return res
}

🍏 点击查看 Java 题解

1
write your code here
本文作者:
本文链接: https://hgnulb.github.io/blog/2022/31938115
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处!