556. 下一个更大元素 III

下一个更大元素 III

题目描述:

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

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

示例 1:

输入:n = 12
输出:21
示例 2:

输入:n = 21
输出:-1

提示:

1 <= n <= 231 - 1

思路:

时间复杂度:O(n),空间复杂度O(n)

从后往前找,找到第一个不符合降序的数字,然后这个数字和从后往前第一个大于他的数字交换,最后将最后一部分升序排列,挺复杂的

代码:

func nextGreaterElement(n int) int {
    var ans []int
    for n != 0{
        ans = append(ans, n %10)
        n/= 10
    }
    i,j := 0,0
    for i=0;i<len (ans)-1;i++{
        if ans[i] >ans[i+1]{
            break
        }
    }
    if i == len(ans)-1{
        return -1
    }
    for j =0;j<i+1;j++{
        if ans[j]>ans[i+1]{
            break
        }
    }
    ans[i+1], ans[j] = ans[j], ans[i+1]
    res := 0
    temp := ans[:i+1]
    ans = ans[i+1:]
    sort.Ints(temp)
    for i:=0;i<len(temp)/2;i++{
        temp[i], temp[len(temp)-i-1] = temp[len(temp)-i-1],temp[i]
    }
    ans = append(temp, ans...)
    for i = len(ans)-1;i>=0;i-- {
        res = res*10 + ans[i]
    }
    if res > (1<<31)-1{
        return -1
    }
    return res
}

代码效率:

执行用时:0 ms, 在所有 Go 提交中击败了100.00%的用户
内存消耗:1.9 MB, 在所有 Go 提交中击败了57.61%的用户


本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!