1、题目描述
给出一个元素无序的数组,求出一个数,使得其左边的数都小于它,右边的数都大于等于它。
要求时间复杂度n
整理及丰富细节:
一个无序的数组,找出所有符合以下特点的数,返回它们的索引。
这个数的左边的数都小于它,右边的数都大于等于它。
要求时间复杂度 O(n) 。
2、示例
输入:[2,3,1,8,9,20,12]
输出:[8,9]
3、题解
思路
使用单调栈
- 当元素入栈的时候,单调栈只能保证入栈元素比栈内元素都大,但是不能保证是数组中出现过的最大的
- 所以额外需要一个最大值,来增强入栈规则
- 出栈的元素曾经是满足条件的,但是现在出现更大的数字,不符合规则,被淘汰
vector<int> getMidNum(vector<int>& nums) {
vector<int> ans;
int maxn = INT_MIN;
for (int i = 0; i < nums.size(); i++) {
while (!ans.empty() && !(nums[ans.back()] < nums[i])) {
ans.pop_back();
}
if (nums[i] > maxn) {
ans.push_back(i);
}
maxn = max(maxn, nums[i]);
}
return ans;
}