题目:
一个循环数组 nums ( nums[nums.length - 1] 的下一个元素是 nums[0] ),返回 nums 中每个元素的 下一个更大元素 。
数字 x 的 下一个更大的元素 是按数组遍历顺序,这个数字之后的第一个比它更大的数,这意味着你应该循环地搜索它的下一个更大的数。如果不存在,则输出 -1 。
算法:
方法一:暴力法
func nextGreaterElements(nums []int) []int {
n := len(nums)
ans := make([]int, n)
for i := 0; i < len(nums); i ++ {
next := (i + 1 + n) % n
for next != i && nums[next] <= nums[i] {
// fmt.Println(i, next)
next = (next + 1 + n) % n
}
if next == i {
ans[i] = -1
} else {
ans[i] = nums[next]
cur := nums[i]
// 后面这段属于优化
i ++
for i < next && cur < nums[i] && nums[i] < next {
ans[i] = nums[i]
i ++
}
i --
// 上面这段属于优化
}
}
return ans
}
方法二:单调栈
func nextGreaterElements(nums []int) []int {
n := len(nums)
ans := make([]int, n)
for i := range ans {
ans[i] = -1
}
// stack保存暂时还没找到下一个最大值的index
stack := make([]int, 0)
for i := 0; i < n; i ++ {
for len(stack) > 0 && nums[stack[len(stack) - 1]] < nums[i] {
ans[stack[len(stack) - 1]] = nums[i]
stack = stack[:len(stack) - 1]
}
stack = append(stack, i)
}
// 后入栈的会先比较,遍历第2次是因为i入栈的时候,第一个比nums[i]大的位置可能小于i,第二次不入栈,只比较
// 可以用[2,3,1]这个数组模拟
for i := 0; i < n; i ++ {
for len(stack) > 0 && nums[stack[len(stack) - 1]] < nums[i] {
ans[stack[len(stack) - 1]] = nums[i]
stack = stack[:len(stack) - 1]
}
}
return ans
}