leetcode 239 Sliding Window Maximum
这题是典型的堆排序算法,只是比一般的堆算法多了删除的操作,有两件事需要做:
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的更多相关文章
- [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 ...
- [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 ...
- [leetcode] #239 Sliding Window Maximum (Hard)
原题链接 题意: 给定一个数组数字,有一个大小为k的滑动窗口,它从数组的最左边移动到最右边.你只能在窗口看到k个数字.每次滑动窗口向右移动一个位置. 记录每一次窗口内的最大值,返回记录的值. 思路: ...
- 【LeetCode】239. Sliding Window Maximum
Sliding Window Maximum Given an array nums, there is a sliding window of size k which is moving fr ...
- 【刷题-LeetCode】239. Sliding Window Maximum
Sliding Window Maximum Given an array nums, there is a sliding window of size k which is moving from ...
- 【LeetCode】239. Sliding Window Maximum 解题报告(Python&C++)
作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 单调递减队列 MultiSet 日期 题目地址:ht ...
- 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 ...
- LeetCode题解-----Sliding Window Maximum
题目描述: Given an array nums, there is a sliding window of size k which is moving from the very left of ...
- 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 ...
随机推荐
- ing
#include <stdio.h> int main(){ int a,b; while(scanf("%d%d",&a,&b)!=EOF & ...
- selenium+python笔记3
#!/usr/bin/env python # -*- coding: utf-8 -*- """ @desc:学习unittest的用法 注意setUp/setUpCl ...
- SPSS中变量的度量标准
在SPSS中,每一个变量都有一个度量标准,这些度量标准说明变量的含义和属性,会对后续的分析产生影响. 1.名义:名义表示定类变量,定类变量表示事物的类别,只能计算频数和频率,各类别之间没有大小.顺序. ...
- jsp-------------之分页技术(一)
jsp分页技术之: 如下图:百度的喵 看上图中卡哇伊的小苗的爪子下面的数字,就是分页啦!那我们如何做出这样一个效果呢? 下面我们来逐一分解: jsp分页技术一 : (算法) /* int pageS ...
- DOI EXCEL显示报表
我这个是比较不规则的数据填充 1.程序开头,定义一个工作区,存对应单元格的值: BEGIN OF TY_EXCEL, C031() TYPE C, C032() TYPE C, C033() TYPE ...
- 高度30px,宽度自适应,点线在文字中间
<style> .div{ position: relative; width: 100%; height: 30px; background: #ffff00} .div ...
- Steam和Byte[]之间进行输换
一. 二进制转换成图片 MemoryStream ms = new MemoryStream(bytes); ms.Position = 0; Image img = Image.FromStream ...
- Linux学习之CentOS--CentOS6.4下Mysql数据库的安装与配置【转】
如果要在Linux上做j2ee开发,首先得搭建好j2ee的开发环境,包括了jdk.tomcat.eclipse的安装(这个在之前的一篇随笔中已经有详细讲解了Linux学习之CentOS(七)--C ...
- ACTIVITI 表结构数据分析
ACTIVITI ACT_RU_EXECUTION 表 这个表是工作流程的核心表,流程的驱动都和合格表有密切的关系. 一般来讲一个流程实例都有一条主线.如果流程为直线流程,那么流程实例在这个表 ...
- discuz 同步登录问题
最近一直在搞discuz论坛的二次开发,发现在论坛登录或退出的时候应用却没有同步登录或同步退出,这下子麻烦了,后来查看,原来没有产生js的同步代码,查找原因,发现$_G['setting']['all ...