zoukankan      html  css  js  c++  java
  • Kth Largest Element in a Stream

    Design a class to find the kth largest element in a stream. Note that it is the kth largest element in the sorted order, not the kth distinct element.

    Your KthLargest class will have a constructor which accepts an integer k and an integer array nums, which contains initial elements from the stream. For each call to the method KthLargest.add, return the element representing the kth largest element in the stream.

    Example:

    int k = 3;
    int[] arr = [4,5,8,2];
    KthLargest kthLargest = new KthLargest(3, arr);
    kthLargest.add(3);   // returns 4
    kthLargest.add(5);   // returns 5
    kthLargest.add(10);  // returns 5
    kthLargest.add(9);   // returns 8
    kthLargest.add(4);   // returns 8
    

    Note: 
    You may assume that nums' length ≥ k-1 and k ≥ 1.

    Approach #1: C++.[priority_queue]

    class KthLargest {
    public:
        KthLargest(int k, vector<int> nums) {
            size = k;
            for (int i = 0; i < nums.size(); ++i) {
                pq.push(nums[i]);
                if (pq.size() > k) pq.pop();
            }
        }
        
        int add(int val) {
            pq.push(val);
            if (pq.size() > size) pq.pop();
            return pq.top();
        }
        
    private:
        priority_queue<int, vector<int>, greater<int>> pq;
        int size;
    };
    
    /**
     * Your KthLargest object will be instantiated and called as such:
     * KthLargest obj = new KthLargest(k, nums);
     * int param_1 = obj.add(val);
     */
    

      

    Approach #2: Java.[BST]

    class KthLargest {
        TreeNode root;
        int k;
    
        public KthLargest(int k, int[] nums) {
            this.k = k;
            for (int num : nums) root = add(root, num);
        }
        
        public int add(int val) {
            root = add(root, val);
            return findKthLargest();
        }
        
        private TreeNode add(TreeNode root, int val) {
            if (root == null) return new TreeNode(val);
            root.count++;
            if (val < root.val) root.left = add(root.left, val);
            else root.right = add(root.right, val);
            return root;
        }
        
        public int findKthLargest() {
            int count = k;
            TreeNode walker = root;
            
            while (count > 0) {
                int pos = 1 + (walker.right != null ? walker.right.count : 0);
                if (count == pos) break;
                if (count > pos) {
                    count -= pos;
                    walker = walker.left;
                } else if (count < pos) 
                    walker = walker.right;
            }
            return walker.val;
        }
        
        class TreeNode {
            int val, count = 1;
            TreeNode left, right;
            TreeNode(int v) { val = v; }
        }
    }
    
    /**
     * Your KthLargest object will be instantiated and called as such:
     * KthLargest obj = new KthLargest(k, nums);
     * int param_1 = obj.add(val);
     */
    

      

    Approach #3: Python.[priority_queue].

    class KthLargest(object):
    
        def __init__(self, k, nums):
            """
            :type k: int
            :type nums: List[int]
            """
            self.pool = nums
            self.k = k
            heapq.heapify(self.pool)
            while len(self.pool) > k:
                heapq.heappop(self.pool)
            
    
        def add(self, val):
            """
            :type val: int
            :rtype: int
            """
            if len(self.pool) < self.k:
                heapq.heapq.push(self.pool, val)
            elif val > self.pool[0]:
                heapq.heapreplace(self.pool, val)
            return self.pool[0]
            
    
    
    # Your KthLargest object will be instantiated and called as such:
    # obj = KthLargest(k, nums)
    # param_1 = obj.add(val)
    

      

    永远渴望,大智若愚(stay hungry, stay foolish)
  • 相关阅读:
    Spring、Spring Boot 和 Spring Cloud 的关系
    Spring Boot 如何设置支持跨域请求?
    什么是嵌入式服务器?我们为什么要使用嵌入式服务器呢?
    nginx配置域名,不要端口
    域名解析以及nginx服务器设置
    为什么使用nginx
    RabbitMQ下载与安装(window版)
    spring的@ComponentScan注解
    spring的@EnableScheduling注解
    日志切割: logrotate、python、shell实现
  • 原文地址:https://www.cnblogs.com/h-hkai/p/10013821.html
Copyright © 2011-2022 走看看