内容:
1、原始问题
2、拓展题
1、原始问题
题目描述:
给你一个数组,找出数组中每个数左边离它近的比它大的数和右边离它近的比它大的数 要求算法时间复杂度为O(N)
解题思路:
使用一个栈,要求每次元素进栈后要维持栈中从栈底到栈顶元素值是从大到小排列的约定。将数组中的元素依次进栈,
如果某次元素进栈后会违反了上述的约定(即该进栈元素比栈顶元素大),就先弹出栈顶 元素,并记录该栈顶元素的信息:
- 该元素左边离它近的比它大的是该元素出栈后的栈顶元素,如果出栈后栈空,那么该元素左边没有比 它大的数
- 该元素右边离它近的比它大的是进栈元素
然后再尝试将进栈元素进栈,如果进栈后还会违反约定那就重复操作“弹出栈顶元素并记录该元素信息”,直到符合约定
或栈中元素全部弹出时再将该进栈元素进栈。当数组所有元素都进栈之后,栈势必不为空,弹出 栈顶元素并记录信息:
- 该元素右边没有比它大的数
- 该元素左边离它近的比它大的数是该元素从栈弹出后的栈顶元素,如果该元素弹出后栈为空,那么该 元素左边没有比它大的数
由于每个元素仅进栈一次、出栈一次,且出栈时能得到题目所求信息,因此时间复杂度为 O(N)
代码:
2、拓展题