欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

n个整数的无序数组,找到每个元素后面比它大的第一个数,要求时间复杂度为O(N)

程序员文章站 2024-03-15 19:16:18
...

题目:n个整数的无序数组,找到每个元素后面比它大的第一个数,要求时间复杂度为O(N)

今天看到的这样的一题,感觉还是挺有意思的,记录下来

它给出了一个函数,填写以下函数完成功能

vector<int> FindMax(vector<int> &num)
{
}

从函数可以看出传入的无序数组使用vector来存储的,而且我们需要返回一个vector

一开始拿到题目,我们很容易想到对于每个元素,遍历它后面的元素就能找到第一个比它大的了,但是这样的话时间消耗可能会超过O(N),因此在这当中可能会漏到很多信息,以至于我们每次都要去比较。那应该用什么呢?
可以设想一下:如果我当前的处理对象是第1个元素,如果第2个元素比我小,那么我现在要做的不是去比较第3个元素与第1个元素的关系,而是将处理的对象变成第2个元素。如果第3个元素比第2个元素大,我在回过来比较第1个元素,这样是不是就省去了很多时间?

因此我们需要一个容器来存储未处理的元素,可以看到,元素是后进先出的,比如第2个元素,后后到来却是先得到结果的。因此我们可以用栈(stack) 来存储未处理的元素

根据以上思想可以得出以下代码:

vector<int>  FindMax(vector<int> &num)
{
    int len=num.size();
    if(len==0) return {};    //空数组,返回空
    vector<int> res(len,-1);    //返回结果:初始化-1,表示未找到
    stack<int> notFind; //栈:num中还未找到符合条件的元素索引

    int i=0;
    while(i<len)    //遍历数组
    {
         //如果栈空或者当前num元素不大于栈顶,将当前元素压栈,索引后移
        if(notFind.empty() || num[notFind.top()]>=num[i])
        {
            notFind.push(i++);
        }
       //有待处理元素,且num当前元素大于栈顶索引元素,符合条件,更新结果数组中该索引的值,栈顶出栈。
        else
        {
            res[notFind.top()]=num[i];
            notFind.pop();
        } 
    }
 return res;
}

可以输入几个测试样例,比如:

 vector<int> num = {1, 3, 2, 4, 99, 101, 5, 8};

得到结果如下(-1表示后面没有比自己大的):
n个整数的无序数组,找到每个元素后面比它大的第一个数,要求时间复杂度为O(N)

相关标签: c++

上一篇: 100以内质数-Java基础

下一篇: Junit