从左往右遍历 nums,用(递减)单调栈 s 记录元素,如果 x=\textit{nums}[i] 比 s 的栈顶大,则 x 是栈顶的下个更大元素,弹出栈顶。最后把 x 入栈(实际入栈的是下标 i)。
把弹出的元素加到另一个栈 t 中(注意保持原始顺序),后续循环时,如果 y=\textit{nums}[j] 比 t 的栈顶大,则 y 是栈顶的下下个更大元素,记录答案,弹出栈顶。
[sol1-Python3]
1 2 3 4 5 6 7 8 9 10 11 12 13
classSolution: defsecondGreaterElement(self, nums: List[int]) -> List[int]: ans, s, t = [-1] * len(nums), [], [] for i, x inenumerate(nums): while t and nums[t[-1]] < x: ans[t.pop()] = x j = len(s) - 1 while j >= 0and nums[s[j]] < x: j -= 1 t += s[j + 1:] del s[j + 1:] s.append(i) return ans
funcsecondGreaterElement(nums []int) []int { ans := make([]int, len(nums)) for i := range ans { ans[i] = -1 } s, t := []int{}, []int{} for i, x := range nums { forlen(t) > 0 && nums[t[len(t)-1]] < x { ans[t[len(t)-1]] = x t = t[:len(t)-1] } j := len(s) - 1 for j >= 0 && nums[s[j]] < x { j-- } t = append(t, s[j+1:]...) s = append(s[:j+1], i) } return ans }