• 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

    点击前往

  • 相关阅读:
    弄明白python reduce 函数
    Python 2与Python 3兼容性的写法,需要一个特殊的包 from __future__ import print_function 用法
    人工智能数学参考---8、常用激活函数
    常用激活函数(激励函数)理解与总结
    人工智能数学参考---7、核函数应用
    [粘贴]环绕闸极不能让三星在3nm工艺领先台积电
    查看java所有的线程信息
    【转载】 Sqlserver使用Left函数从最左边开始截取固定长度字符串
    值初始化和默认初始化的区别
    map的综合例子
  • 原文地址:https://www.cnblogs.com/yangj-Blog/p/14280354.html
Copyright © 2020-2023  润新知