O(n) 取得数组中每个元素右边第一个比它大的元素
题目:
给定一个整型数组,数组元素随机无序的,要求打印出所有元素右边第一个大于该元素的值。
如数组A=[6,8,9,2,3,5,6] 输出[8,9,-1,3,5,6,-1]
思路:
我们用栈来保存未找到右边第一个比它大的元素的索引(后面要用索引来给res数组赋值),初始时,栈里放的是第一个元素的索引0值。
步骤如下:
(1)从 i = 0开始,遍历到数组
1) 如果栈不为空且当前遍历的元素值大于栈顶的元素值,说明当前元素正好是栈顶元素右边第一个比它大的元素,将栈顶元素弹出,result [stack.pop()] = arr [i];
2) 如果栈为空,说明前面的元素都找到了比它右边大的元素,则stack.push(i++);
3)如果当前遍历的元素值arr [i]小于栈顶元素索引的值arr [stack.peek()],说明还未找到栈顶元素中右边第一个比它大的元素,直接stack.push(i++);
如果数组还没有遍历完,回到1),循环
(2)遍历完所有元素,如果栈不为空,说明栈中保存的全是未找到右边第一个比它大的数组索引,我们依次将这些栈元素出栈,并赋值result[stack.pop()] = -1即可。
代码实现:
1 void findNearestMax(int *arr,int n,int *res) { 2 int i = 0; 3 stack<int> s; 4 while (i < n) { 5 if (!s.empty() && arr[i] > arr[s.top()]) { 6 res[s.top()] = arr[i]; 7 s.pop(); 8 } 9 else 10 s.push(i++); 11 } 12 while (!s.empty()) { 13 res[s.top()] = -1; 14 s.pop(); 15 } 16 }