zoukankan      html  css  js  c++  java
  • 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 }
  • 相关阅读:
    齐文词根词缀---1、第一讲
    元音发音规则
    英语重读规则
    英语单词重读规则
    unicode,ansi,utf-8,unicode big endian编码的区别
    Netty中粘包和拆包的解决方案
    【转载】 DirectByteBuffer内存释放
    Netty 中ChannelOption的含义以及使用的场景Netty 中ChannelOption的含义以及使用的场景
    Connection reset原因分析和解决方案
    Netty实现Socket
  • 原文地址:https://www.cnblogs.com/czc1999/p/11486999.html
Copyright © 2011-2022 走看看