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

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;
}
};

  

leetcode 239 Sliding Window Maximum的更多相关文章

  1. [LeetCode] 239. Sliding Window Maximum 滑动窗口最大值

    Given an array nums, there is a sliding window of size k which is moving from the very left of the a ...

  2. [leetcode]239. Sliding Window Maximum滑动窗口最大值

    Given an array nums, there is a sliding window of size k which is moving from the very left of the a ...

  3. [leetcode] #239 Sliding Window Maximum (Hard)

    原题链接 题意: 给定一个数组数字,有一个大小为k的滑动窗口,它从数组的最左边移动到最右边.你只能在窗口看到k个数字.每次滑动窗口向右移动一个位置. 记录每一次窗口内的最大值,返回记录的值. 思路: ...

  4. 【LeetCode】239. Sliding Window Maximum

    Sliding Window Maximum   Given an array nums, there is a sliding window of size k which is moving fr ...

  5. 【刷题-LeetCode】239. Sliding Window Maximum

    Sliding Window Maximum Given an array nums, there is a sliding window of size k which is moving from ...

  6. 【LeetCode】239. Sliding Window Maximum 解题报告(Python&C++)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 单调递减队列 MultiSet 日期 题目地址:ht ...

  7. 239. Sliding Window Maximum

    题目: Given an array nums, there is a sliding window of size k which is moving from the very left of t ...

  8. LeetCode题解-----Sliding Window Maximum

    题目描述: Given an array nums, there is a sliding window of size k which is moving from the very left of ...

  9. 239. Sliding Window Maximum *HARD* -- 滑动窗口的最大值

    Given an array nums, there is a sliding window of size k which is moving from the very left of the a ...

随机推荐

  1. iOS响应式编程:ReactiveCocoa vs RxSwift 选谁好

    转载: iOS响应式编程:ReactiveCocoa vs RxSwift 选谁好 内容来自stack overflow的一个回答:ReactiveCocoa vs RxSwift – pros an ...

  2. jq实现楼层切换效果

    <!DOCTYPE html> <html> <head> <style> * { margin: 0; padding: 0; box-sizing: ...

  3. android浮动搜索框

    android浮动搜索框的配置比较繁琐,需要配置好xml文件才能实现onSearchRequest()方法. 1.配置搜索的XML配置文件​,新建文件searchable.xml,保存在res/xml ...

  4. robotframework笔记19

    后处理输出 使用时自动测试 在测试执行报告和日志生成,并使用它 分别允许创建自定义报告和日志以及结合 和合并的结果. 使用Rebot 简介 rebot [options] robot_outputs ...

  5. Azure平台 对Twitter 推文关键字进行实时大数据分析

    Learn how to do real-time sentiment analysis of big data using HBase in an HDInsight (Hadoop) cluste ...

  6. vs2010 ctrl+F5闪退解决方法

    设置项目的属性页中的“配置属性”->“链接器”->“系统”->“子系统”->“控制台”(即增加“/SUBSYSTEM:CONSOLE”链接选项)

  7. 9. shell环境

    • printenv –打印部分或所有的环境变量 • set –设置 shell 选项 • export —导出环境变量,让随后执行的程序知道. • alias –创建命令别名 1.shell环境:s ...

  8. 转载:javascript面向对象编程:非构造函数的继承

    一.什么是"非构造函数"的继承? 比如,现在有一个对象,叫做"中国人". var Chinese = { nation:'中国' }; 还有一个对象,叫做&qu ...

  9. eclipse 安装git的插件和上传项目

    这里有个链接,已经很详细的写了过程  博客1以及博客2.其实遇到安装的问题,就是因为我用的eclipse版本比较老,但是eclipse里面又装了好多插件,不想在重新安装eclipse.还有一个很好的博 ...

  10. EF Code First:实体映射,数据迁移,重构(1)

    一.前言 经过EF的<第一篇>,我们已经把数据访问层基本搭建起来了,但并没有涉及实体关系.实体关系对于一个数据库系统来说至关重要,而且EF的各个实体之间的联系,实体之间的协作,联合查询等也 ...