C++进阶补充

详情见C++进阶:点击前往

1.C++之函数指针做函数参数、函数回调功能

点击前往

2.题目: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

得到结果如下(-1表示后面没有比自己大的):
在这里插入图片描述

 3.C++多线程

点击前往

4.C++原子操作 atomic的使用及效率

点击前往

5.C++ const顶层底层const

点击前往

原文地址:https://www.cnblogs.com/yangj-Blog/p/14280354.html