zoukankan      html  css  js  c++  java
  • LintCode "Heapify"

    My first try was, using partial sort to figure out numbers layer by layer in the heap.. it only failed with TLE with the last test case. The problem is, partial sort cannot guaratee O(n) every time.

    class Solution
    {
        void kth(vector<int> &A, int s, int e, int k) // all zero based
        {
            if(s >= e) return;
            
            //    Partition
            int i = e, j = e;
            {
                std::random_device rd;
                std::mt19937 gen(rd());
                std::uniform_int_distribution<> dis(s, e);
                
                int pi = dis(gen);
                int pivot = A[pi];
                swap(A[pi], A[s]);
                
                while(j > s)
                {
                    if(A[j] >= pivot)
                    {
                        swap(A[i], A[j]);
                        i --; j = i;
                    }
                    else
                    {
                        j --;
                    }
                }
                swap(A[i], A[s]);
            }
            
            //    Recursion
            if(i < k)
            {
                kth(A, i + 1, e, k);
            }
            else if(i > k)
            {
                kth(A, s, i - 1, k);
            }
        }
    public:
        /**
         * @param A: Given an integer array
         * @return: void
         */
        void heapify(vector<int> &A)
        {
            size_t n = A.size();
            int s = 0, e = n - 1;
            while (s < e)
            {
                int cnt = e - s + 1;
                int h = ceil(log2(cnt));
                int k = (pow(2, h) - 1)/2;
                kth(A, s, e, k - 1);
                e = k - 1;
            }
        }
    };
    View Code

    A smarter way is as below. Its strategy is "per-node maintanence".

    class Solution {
        void help(vector<int> &A, int i)
        {
            int n = A.size();
            int li = i * 2 + 1, ri = i * 2 + 2;
            int left = li < n ? A[li] : INT_MAX;
            int right= ri < n ? A[ri] : INT_MAX;
            
            if(left < right  && left < A[i])
            {
                swap(A[li], A[i]);
                help(A, li);
            }
            else if(right < left && right < A[i])
            {
                swap(A[ri], A[i]);
                help(A, ri);
            }
        }
    public:
        /**
         * @param A: Given an integer array
         * @return: void
         */
        void heapify(vector<int> &A) {
            for(int i = A.size() / 2; i >= 0; i --)
                help(A, i);
        }
    };
  • 相关阅读:
    laravel路由导出和参数加密
    laravel groupby 报错
    Laravel/Lumen 分组求和问题 where groupBy sum
    php swoft redis 发布和订阅
    Linq to Sql学习总结7
    Linq to Sql学习总结6
    Linq to Sql学习总结5
    Linq to Sql学习总结4
    Linq to Sql学习总结3
    Linq to Sql学习总结2
  • 原文地址:https://www.cnblogs.com/tonix/p/4862781.html
Copyright © 2011-2022 走看看