题目描述
求数组中比左边元素都大同时比右边元素都小的元素,返回这些元素的索引。要求时间复杂度$O(N)$
输入:[2, 3, 1, 8, 9, 20, 12]
输出:3, 4
解释:数组中 8, 9 满足题目要求,他们的索引分别是 3、4
解法
思路
最简单最暴力的就是没从头到尾遍历元素,对于每个元素分别往前、往后遍历一下,看看是否它是否满足条件。
这种解法的时间复杂度为$O(N^2)$,不符合题目要求。
通过分析可以得到,对于每个元素,如果它比左侧最大的值要大,同时比右侧最小的值要小,就满足条件。
那如果有这样两个数组,
left_max[i]
表示原数组 [0, i) 的最大值
right_min[i]
表示原数组 (i, n) 的最小值
内循环就可以通过 left_max[i] < nums[i] && nums[i] < right_min[i]
来判断了。
对于 left_max 和 right_min 这两数组,提前先算好,每个数组都能$O(N)$得到。
left_max 和 right_min 递推式如下:
left_max[i] = max(left_max[i-1], nums[i])
right_min[i] = min(right_min[i-1], nums[i])
总时间复杂度为 $O(N)$
代码
import ... |