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 }
  • 相关阅读:
    如何通过setTimeout理解JS运行机制详解
    css3系列之伪类选择器
    css3系列之属性选择器
    css3系列之伪元素选择器
    css3系列之兄弟选择器
    作为了解系列之 预处理器 和 后处理器
    网络系列之跨域
    网络系列之 cookie增删改查(封装)
    网络系列之 jsonp 百度联想词
    网络系列之 什么是ajax 封装ajax
  • 原文地址:https://www.cnblogs.com/czc1999/p/11486999.html
Copyright © 2011-2022 走看看