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 }

 

posted @ 2019-09-08 16:17  czc1999  阅读(497)  评论(0编辑  收藏  举报