• Leetcode 703. 数据流中的第 K 大元素(终于解决)


    在这里插入图片描述
    设计一个找到数据流中第 k 大元素的类(class)。注意是排序后的第 k 大元素,不是第 k 个不同的元素。

    请实现 KthLargest 类:

    • KthLargest(int k, int[] nums) 使用整数 k 和整数流 nums 初始化对象。
    • int add(int val) 将 val 插入数据流 nums 后,返回当前数据流中第 k 大的元素。

    示例:

    输入:
    ["KthLargest", "add", "add", "add", "add", "add"]
    [[3, [4, 5, 8, 2]], [3], [5], [10], [9], [4]]
    输出:
    [null, 4, 5, 5, 8, 8]
    
    解释:
    KthLargest kthLargest = new KthLargest(3, [4, 5, 8, 2]);
    kthLargest.add(3);   // return 4
    kthLargest.add(5);   // return 5
    kthLargest.add(10);  // return 5
    kthLargest.add(9);   // return 8
    kthLargest.add(4);   // return 8
    

    提示:

    • 1 <= k <= 10^4
    • 0 <= nums.length <= 10^4
    • -10 ^ 4 <= nums[i] <= 10^4
    • -10^ 4 <= val <= 10^4
    • 最多调用 add 方法 10^4 次
    • 题目数据保证,在查找第 k 大元素时,数组中至少有 k 个元素

    主要思路:一开始以位只要直接sort就行,但是测试案例9会显示超时
    看了看评论区,有用到队列。思考一番,便采用优先队列解决
    Code:

    class KthLargest {
    public:
        KthLargest(int k, vector<int>& nums) {
            m_index=k;
            m_vec=nums;
            size=k;
            if(m_vec.size())
                sort(m_vec.begin(),m_vec.end(),greater<int>());
            if(m_vec.size())
            {
                for(int i=0;i<k&&(i<nums.size());i++)
                {
                    m_q.push(m_vec[i]);
                    
                }
            }
        }
        int add(int val) {
            if(m_q.size())
            { 
                if(m_q.size()!=size)
                {
                    
                    m_q.push(val);
                    return m_q.top();
                }
                if(val>m_q.top())
                {
                 
                    if((int)m_q.size()==size)
                    {
                        m_q.pop();
                        m_q.push(val);  
                    }
                    else
                    {
                     
                        m_q.push(val);
                    } 
                    cout<<"end"<<endl;
                }
                
                
            }
            else
                m_q.push(val);
            return m_q.top();
            
            
        }
        
    private:
        int m_index=0;
        vector<int>m_vec;
        int m_num=0;
        int size;
        priority_queue<int,vector<int>, greater<int> > m_q;
    };
    
    /**
     * Your KthLargest object will be instantiated and called as such:
     * KthLargest* obj = new KthLargest(k, nums);
     * int param_1 = obj->add(val);
     */
    
  • 相关阅读:
    MySQL常用函数
    MDK关于microlib库问题笔记
    STM32F407ADC多通道+定时器触发+DMA模式设置
    12864LCD学习笔记
    转载:有趣的uC/OS-View
    怎样下载专利文件(特别是中英文对照的专利文件)
    FPGA学习之按键去抖
    数据采样与处理算法
    FTU几种保护逻辑研究
    2016第一篇之AD7606调试
  • 原文地址:https://www.cnblogs.com/xiaohai123/p/16320209.html
Copyright © 2020-2023  润新知