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 + , e, k);
}
else if(i > k)
{
kth(A, s, i - , k);
}
}
public:
/**
* @param A: Given an integer array
* @return: void
*/
void heapify(vector<int> &A)
{
size_t n = A.size();
int s = , e = n - ;
while (s < e)
{
int cnt = e - s + ;
int h = ceil(log2(cnt));
int k = (pow(, h) - )/;
kth(A, s, e, k - );
e = k - ;
}
}
};

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 * + , ri = i * + ;
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() / ; i >= ; i --)
help(A, i);
}
};

最新文章

  1. SELECT INTO 和 INSERT INTO SELECT 两种表复制语句
  2. MVC复杂模型绑定
  3. 操作ACCESS数据库注意事项
  4. iOS 5.0 后UIViewController新增:willMoveToParentViewController和didMoveToParentViewCon[转]
  5. iOS中UITableView的cell点击事件不触发didSelectRowAtIndexPath(汇总)
  6. 使用bootstrap时,选项框出现的意外效果,怎么办?
  7. ASP.NET Zero--15.一个例子(8)商品分类管理-权限控制
  8. python在cmd上导包成功,但是python charm上面就提示找不到
  9. 自动化测试—monkeyrunner
  10. jmeter-Java-MongoDB 数据库增删改查操作
  11. js 闭包,作用域,this 终结篇(转)
  12. JAVA程序设计的第一次作业
  13. unittest的使用二——生成基于html的测试报告
  14. 【leetcode-84】 柱状图中最大的矩形
  15. C# 随机四位数验证码
  16. 使用phpExcel导出excel文件
  17. js API
  18. JavaScript设计模式-18.享元模式
  19. 数组B - 我想我需要一艘船屋
  20. 海康ipc onvif抓包分析

热门文章

  1. lost+found目录
  2. 推荐!Sublime Text 最佳插件列表
  3. Highcharts ajax获取json对象动态生成报表生成 .
  4. 225. Implement Stack using Queues
  5. (转)Tarjan应用:求割点/桥/缩点/强连通分量/双连通分量/LCA(最近公共祖先)
  6. C++编程开发学习的50条建议(转)
  7. 《Linux与Qt程序设计》知识框架
  8. 利用CSS的@font-face属性 在网页中嵌入字体
  9. spring beans源码解读之--Bean的注解(annotation)
  10. C# 正则表达式类 Match类和Group类