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 协议 ,转载请注明出处!