这题是典型的堆排序算法,只是比一般的堆算法多了删除的操作,有两件事需要做:

1 用一个hash表存储从输入数组索引到堆数组(用于实现堆的那个数组)所以的映射,以便在需要删除一个元素的时候能迅速定位到堆数组中的位置

2用一个set保存已经被删除的元素索引(这里指的是输入数组索引),这一点可选;还有一种做法就是直接将已删除元素的值设为最小INT_MIN,不过在leetcode里面并没有说清楚数据范围

class Solution {
public:
unordered_map<int, int> dict;
unordered_set<int> invalidSet;
inline int LEFT(int i){
return 2 * i + 1;
}
inline int RIGHT(int i){
return 2 * i + 2;
}
inline int PARENT(int i){
return (i - 1) / 2;
}
void max_heapify(int ind, vector<int>& arr, const vector<int>& value_arr){
int l = LEFT(ind);
int r = RIGHT(ind);
int largest = ind;
if(l < arr.size() && (invalidSet.find(arr[l]) == invalidSet.end())
&& (invalidSet.find(arr[largest]) != invalidSet.end()
|| value_arr[arr[l]] > value_arr[arr[largest]])){
largest = l;
}
if(r < arr.size() && (invalidSet.find(arr[r]) == invalidSet.end())
&& (invalidSet.find(arr[largest]) != invalidSet.end()
|| value_arr[arr[r]] > value_arr[arr[largest]])){
largest = r;
}
if (largest != ind){
swap(dict[arr[ind]], dict[arr[largest]]);
swap(arr[ind], arr[largest]);
max_heapify(largest, arr, value_arr);
}
}
void max_heap_insert(int ind, vector<int>& arr, const vector<int>& value_arr){
arr.push_back(ind);
dict[ind] = arr.size() - 1;
int i = arr.size() - 1;
while (i > 0 && (invalidSet.find(arr[PARENT(i)]) != invalidSet.end()
|| value_arr[arr[PARENT(i)]] < value_arr[arr[i]])){
swap(dict[arr[i]], dict[arr[PARENT(i)]]);
swap(arr[i], arr[PARENT(i)]);
i = PARENT(i);
}
}
void max_heap_delete(int ind, vector<int>& arr, const vector<int>& value_arr){
invalidSet.insert(ind);
max_heapify(dict[ind], arr, value_arr);
}
vector<int> maxSlidingWindow(vector<int>& nums, int k) {
vector<int> result;
if(nums.size() == 0)
return result;
vector<int> h;
h.reserve(nums.size());
for(int i = 0; i < k; i++)
max_heap_insert(i, h, nums);
result.push_back(nums[h[0]]);
for(int i = k; i < nums.size(); i++){
max_heap_delete(i - k, h, nums);
max_heap_insert(i, h, nums);
result.push_back(nums[h[0]]);
}
return result;
}
};

  

最新文章

  1. 商城项目:装nginx时碰到的各种问题
  2. Rails : css或js文件无法成功预编译或调用jquery类插件时预编译问题
  3. Jstl简单应用
  4. SAP中禁止特定用户更改密码
  5. 【BZOJ-1923】外星千足虫 高斯消元 + xor方程组
  6. 带复杂表头合并单元格的HtmlTable转换成DataTable并导出Excel
  7. Python发布Django项目的pyc版脚本
  8. HTML语言的一些元素(四)
  9. 【C语言】字符串替换空格:实现一个函数,把字符串里的空格替换成“%20”
  10. CSS样式的优先级
  11. 02.[WPF]如何固定窗口的大小
  12. POJ 2411 Mondriaan&amp;#39;s Dream (dp + 减少国家)
  13. Jmeter的优点是什么?除了轻量级,它和LoadRunner有什么本质区别
  14. rtmp流媒体搭建的所需安装包
  15. Spring入门(3-1)Spring的标签命名空间
  16. Python学习笔记 - 字符串和编码
  17. Ubuntu14.04部署pyspider的过程
  18. LeetCode算法题-Reshape the Matrix(Java实现)
  19. 【nowcoder-2017校招真题】保留最大的数
  20. ACdream1187-Rational Number Tree-模拟/找规律

热门文章

  1. [Java] Java 获取数据库所有表基本信息和表中的所有列基本信息代码
  2. HTML5自学笔记[ 3 ]表单验证反馈
  3. python中read、readline和readlines
  4. linq分页扩展(转)
  5. MATLAB实现矩阵分块相乘
  6. PHP超级全局变量——Session 变量
  7. Sharepoint2010突然之间不能打开页面,报503错误The service is unavailable
  8. [Jquery]焦点图轮播效果
  9. js基础之数组
  10. Windows XP PRO SP3 - Full ROP calc shellcode