503.下一个更大元素 II

48 阅读1分钟

题目:
一个循环数组 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
}