• 数据结构——栈——寻找下一个较大元素


    题目描述

    给出一个数组,向右寻找每一个元素的下一个较大的元素,没有更大的则为-1

    举例

    {4,6,1,3,2,5}

    则求得的答案应为

    {6,-1,3,5,5,-1}

    题目分析

    首先对于这样的题目,我们总是先想到最简单的,那么就是枚举,每次循环一个元素,不停的向右找就可以了。时间复杂度应该是n^2

    但是这样肯定是不够用的。

    然后我们考虑,这道题我们实际上遇到的问题是什么?

    其实简单的说,这道题的意思是,在变化的数组中找到下一个较大的值。

    难点在于,数组元素的变化,以及不是找最大值,而是找下一个较大值。

    这里就要用到我们的数据结构——栈

    如何用栈来存放当前的值使之能在更短的时间内得出结果呢?

    依旧结合图来分析。

    图解分析

    image

    image

    代码分析

    /**
    *求下一个最大值-stack   
    **/ 
    
    #include <cstdio>
    #include <cstdlib> 
    #include <iostream>
    #include <algorithm>
    #include <stack>
    
    using namespace std;
     
    int dataArray[6]={4,6,1,3,2,5};
    int resultArray[6]={-1,-1,-1,-1,-1,-1};
    
    //这边的栈保存的是原数组中的位置而不是数组元素本身 
    stack<int> desStack;
    
    int main() 
    {
        int i=0,n=6;
        for(i=0; i<n; i++)
        {
            while(!desStack.empty() && dataArray[desStack.top()]<dataArray[i])
            {
                resultArray[desStack.top()] = dataArray[i];
                desStack.pop();
            }
            desStack.push(i); 
        }
        
        for(i=0; i<n; i++)
        cout<<resultArray[i]<<"  ";
        
        return 0;
    }

    对于问题的思考

    做完这道题我就慢慢的对栈这个数据结构的用法有了一些变化,之前是利用栈去求当前栈的最小值,这里是求下一个最大值。

    问题本身可能有区别,但是有一些共性那就是,所要求的数据都是变长的,而所要求的数据都是以一种递增或者递减的顺序排列着,中间夹杂这别的元素。

    而栈在这里起的作用就是1、保存了这种递增或者递减的次序。2、即使有新的元素加入就能通过出栈或者入栈来维护需要的答案。

    所以,之后,在实际中,如果遇到一些变化长度的数据,但是数据的次序不发生改变,这种时候我们就可以使用栈,来辅助存放数据,来保存数据和求得结果。

    对于求栈的最小值,可以参考我之前的博客。

  • 相关阅读:
    洛谷 P2979 [USACO10JAN]奶酪塔Cheese Towers
    celery -2
    【express】
    ↗☻【HTML5秘籍 #BOOK#】第8章 使用CSS3
    -_-#【Dom Ready / Dom Load】
    【jQuery】
    ♫【Avalon】
    【兼容】IE下PNG色差
    ↗☻【HTML5秘籍 #BOOK#】第4章 Web表单
    洛谷—— P1328 生活大爆炸版石头剪刀布
  • 原文地址:https://www.cnblogs.com/linkstar/p/6180816.html
Copyright © 2020-2023  润新知