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表示后面没有比自己大的):
上一篇: 100以内质数-Java基础
下一篇: Junit