556.下一个更大元素 III

60 阅读1分钟

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

注意 ,返回的整数应当是一个 32 位整数 ,如果存在满足题意的答案,但不是 32 位整数 ,同样返回 -1 。
解法: 解法31. 下一个排列的官方题解相同

import "math"
func nextGreaterElement(n int) int {
	cnt := 0
	num := n
	array := make([]int, 0)
	for num != 0 {
		cnt ++
		array = append(array, num % 10)
		num = num / 10
	}
	if n < 2 {
		return -1
	}

	ans := 0
	i := 1
	for ; i < cnt; i ++ {
		if  array[i - 1] > array[i] {
			break
		}
	}
	// fmt.Println(array)
	minimalInMax := i - 1
	// i != cnt意味着 n从右往左按位查找,找到了降序的点
	if i != cnt {
		// 遍历的方向要注意,否则最高位的2和此高位的3交换,23332得到32233是错误结果。
		// minimalInMax大的值里面最小的,
		for j := i -1; j >= 0; j -- {
			if array[j] > array[i] && array[j] <= array[minimalInMax] {
				minimalInMax = j
			}
		}
		array[i], array[minimalInMax] = array[minimalInMax], array[i]
		for left, right := 0, i - 1; left < right; left, right = left + 1, right - 1 {
			array[left], array[right] = array[right], array[left]
		}
	// 没找到
	} else {
		return -1
	}
	// fmt.Println(array)
	// 将array组合成数字
	carry := 1
	for i := range array {
		ans = ans + carry * array[i]
		carry = carry * 10
	}

	if ans > math.MaxInt32 {
		return -1
	}
	return ans
}