zoukankan      html  css  js  c++  java
  • 数据结构——栈——寻找下一个较大元素

    题目描述

    给出一个数组,向右寻找每一个元素的下一个较大的元素,没有更大的则为-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、即使有新的元素加入就能通过出栈或者入栈来维护需要的答案。

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

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

  • 相关阅读:
    疫情环境下的网络学习笔记 python 5.8 数据库入门终章
    疫情环境下的网络学习笔记 python 5.7 navicat数据库,例题,sql注入
    疫情环境下的网络学习笔记 python 5.6 暂时看看
    疫情环境下的网络学习笔记 python 5.5 MYSql 表关系,外键
    疫情环境下的网络学习笔记 python 5.4 数据库基础
    疫情环境下的网络学习笔记 python 4.30 初识数据库
    疫情环境下的网络学习笔记 python 4.29 网络小项目
    XJOI 夏令营501-511测试11 游戏
    XJOI 夏令营501-511测试11 统计方案
    CF1197D Yet Another Subarray Problem
  • 原文地址:https://www.cnblogs.com/linkstar/p/6180816.html
Copyright © 2011-2022 走看看