LintCode "Heapify"
2015-10-09 01:50
344 查看
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.
View Code
A smarter way is as below. Its strategy is "per-node maintanence".
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); } };
相关文章推荐
- iOS7自定义statusbar和navigationbar的若干问题
- iOS7的statusBar和navigationBar
- BZOJ3463 : [COCI2012] Inspector
- TDD相关测试框架
- Ubuntu Install Heroku(Week I)
- ARM 关键几个寄存器
- 字符集乱码问题:ISO-8859-1和GBK
- 51nod 最长公共子序列 (DP+回溯)
- python rmq
- 【QT】QT4.8.6静态编译
- 对重构的理解
- Smarty+php实现分页以及删除记录
- 浅谈计算机中的存储模型(一)存储体系
- oracle手注
- iOS开发——高级篇——通讯录
- Linux yum命令以及centOs安装jdk、tomcat、mysql
- ARM寻址方式
- 汉诺塔
- [Javascript] Array - join()
- PyQt5程序