zoukankan      html  css  js  c++  java
  • 【leetcode】Kth Largest Element in an Array (middle)☆

    Find the kth largest element in an unsorted array. Note that it is the kth largest element in the sorted order, not the kth distinct element.

    For example,
    Given [3,2,1,5,6,4] and k = 2, return 5.

    思路:

    堆。讲解:二叉堆

    class Solution {
    public:
        //新插入i结点 其父节点为(i - 1) / 2
        void MinHeapFixup(int a[], int i) 
        {
            int j = (i - 1) / 2; //父节点
            int temp = a[i];
            while(j >= 0 && i != 0)
            {
                if(a[j] <= temp) break;
                a[i] = a[j];
                i = j;
                j = (i - 1) / 2;
            }
            a[i] = temp;
        }
    
        //在最小堆中插入新数据nNum
        void MinHeapAddNumber(int a[], int n, int nNum)
        {
            a[n] = nNum;
            MinHeapFixup(a, n);
        }
    
        //堆删除后的调整  从i节点开始调整,n为节点总数 从0开始计算 i节点的子节点为 2*i+1, 2*i+2
        void MinHeapFixdown(int a[], int i, int n)
        {
            int j = 2 * i + 1;
            int temp = a[i];
            while(j < n)
            {
                if(j + 1 < n && a[j + 1] < a[j]) //在左右孩子中找最小的
                    j++;
                if(a[j] >= temp) 
                    break;
                a[i] = a[j];  //把较小的子结点往上移动,替换它的父结点
                i = j;
                j = 2 * i  + 1;
            }
            a[i] = temp;
        }
    
        //在最小堆中删除数
        void MinHeapDeleteNumber(int a[], int n)
        {
            swap(a[0], a[n - 1]);
            MinHeapFixdown(a, 0, n - 1);
        }
    
        int findKthLargest(vector<int>& nums, int k) {
            int * a = new int[k]; //大小为k的最小堆
            for(int i = 0; i < nums.size(); ++i)
            {
                if(i < k)
                {
                    MinHeapAddNumber(a, i, nums[i]); //插入数据
                }
                else if(nums[i] > a[0]) //比已有的k个最大的数字大
                {
                    MinHeapDeleteNumber(a, k);
                    MinHeapAddNumber(a, k - 1, nums[i]);
                }
            }
            return a[0];
        }
    };

    用STL的堆:

     int findKthLargest(vector<int>& nums, int k) {
        priority_queue<int> p;
        const int s(nums.size());
    
        for (int i = 0; i < s; ++i) p.push(nums[i]);
        while (--k) p.pop();
    
        return p.top();
    }

    堆的相关讲解:

    http://www.cnblogs.com/flyoung2008/articles/2136485.html

  • 相关阅读:
    celery 定时任务demo
    zip函数的使用
    关于数论的知识整理——待更新
    线性基
    博弈论博客推荐
    BZOJ1597: [Usaco2008 Mar]土地购买——斜率优化
    BZOJ1096 [ZJOI2007]仓库建设——斜率优化
    bzoj1010: [HNOI2008]玩具装箱toy——斜率优化
    斜率优化
    HDU3480 Division——四边形不等式或斜率优化
  • 原文地址:https://www.cnblogs.com/dplearning/p/4526523.html
Copyright © 2011-2022 走看看