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 }
  • 相关阅读:
    增强MyEclipse提示功能
    Mysql安装配置,修改初试密码。
    在我的电脑里面创建图标
    popup non topmost
    多线程下载或上传数据限速
    SynchronizationContext
    linux运维笔记——常用命令详解diff
    linux运维笔记——curl
    linux下mysql的源码安装
    shell编程——变量的数值计算
  • 原文地址:https://www.cnblogs.com/czc1999/p/11486999.html
Copyright © 2011-2022 走看看