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

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. 【CITE】C# 如何 实现一个窗体和另一个窗体始终保持相对的位置

    C# 如何 实现一个窗体和另一个窗体始终保持相对的位置,任由一个窗体移动,当点击按钮时,弹出的另一个窗体也与之保持相对位置(如左上角)你根据第一个窗体的location去算第二个窗体的location ...

  2. mongodb配置及简单示例

    安装 在官网下载安装 https://www.mongodb.com/ 配置 我的电脑—>右键属性—>左边列表中的高级程序设置—>环境变量 点击path 把你的mongodb文件路径 ...

  3. ajax轮询session阻塞问题

    近来读了几篇关于ASP.NET下Session机制的文章,结合自己的实际应用,有点感想:        在ASP.NET的Session的默认机制下,对同一个SessionID下的用户请求ASP.NE ...

  4. 数据库中Schema(模式)概念的理解

    在学习SQL的过程中,会遇到一个让你迷糊的Schema的概念.实际上,schema就是数据库对象的集合,这个集合包含了各种对象如:表.视图.存储过程.索引等.为了区分不同的集合,就需要给不同的集合起不 ...

  5. android:configChanges属性

    对android:configChanges属性,一般认为有以下几点: 1.不设置Activity的android:configChanges时,切屏会重新调用各个生命周期,切横屏时会执行一次,切竖屏 ...

  6. poj2284 That Nice Euler Circuit(欧拉公式)

    题目链接:poj2284 That Nice Euler Circuit 欧拉公式:如果G是一个阶为n,边数为m且含有r个区域的连通平面图,则有恒等式:n-m+r=2. 欧拉公式的推广: 对于具有k( ...

  7. NetworkComms网络通信框架V3结构图

    NetworkComms网络通信框架序言 来自英国的c#网络通信框架,历时五年打造,由英国剑桥的2位工程师倾情开发,最新版本V3.x版本.

  8. ant非法字符:\65279 错误

    ant非法字符:\65279 错误前段时间用ant把项目打包,遇到一个问题:编译java文件的时候,有些java文件报非法字符 \65279错误,在网上找和很多方法,也试了很多方法,换JDK,网上说的 ...

  9. PHP多线程类

    <?php /** * @title: PHP多线程类(Thread) * @version: 1.0 * @author: phper.org.cn < web@phper.org.cn ...

  10. 注册并启动 Reporting Services SharePoint 服务

    在安装 SharePoint 之前已安装 Reporting Services SharePoint 模式.所以Reporting Services SharePoint 是不能正常使用的. 安装完S ...