【每日一题】 480. 滑动窗口中位数

避免每日太过咸鱼,一天搞定一道LeetCode算法题

一、题目描述

难度: 困难

中位数是有序序列最中间的那个数。如果序列的大小是偶数,则没有最中间的数;此时中位数是最中间的两个数的平均数。

例如:

[2,3,4],中位数是 3
[2,3],中位数是 (2 + 3) / 2 = 2.5
给你一个数组 nums,有一个大小为 k 的窗口从最左端滑动到最右端。窗口中有 k 个数,每次窗口向右移动 1 位。你的任务是找出每次窗口移动后得到的新窗口中元素的中位数,并输出由它们组成的数组。

提示:

  • 你可以假设 k 始终有效,即:k 始终小于输入的非空数组的元素个数。
  • 与真实值误差在 10 ^ -5 以内的答案将被视作正确答案。

示例 1:

给出 nums = [1,3,-1,-3,5,3,6,7],以及 k = 3。
窗口位置                      中位数
---------------               -----
[1  3  -1] -3  5  3  6  7       11 [3  -1  -3] 5  3  6  7      -11  3 [-1  -3  5] 3  6  7      -11  3  -1 [-3  5  3] 6  7       31  3  -1  -3 [5  3  6] 7       51  3  -1  -3  5 [3  6  7]      6
因此,返回该滑动窗口的中位数数组 [1,-1,-1,3,5,6]。

二、题解

1. 解法

解题思路:

不要把问题想得太复杂,二分查找+冒泡排序完全可以解决

  • 维护一个排过序的滑动窗口数组
  • 使用二分查找检索删除的索引
  • 将需要删除的值替换为需要插入的值
  • 使用局部冒泡排序保证数组顺序

代码

public double[] medianSlidingWindow(int[] nums, int k) {double[] res = new double[nums.length - k + 1];int[] window = new int[k];//添加初始值for (int i = 0; i < k; i++) {window[i] = nums[i];}//初始的快排,懒得写直接调用Arrays.sort(window);res[0] = getMid(window);//窗口滑动for (int i = 0; i < nums.length - k; i++) {//需要删除的数int index = search(window, nums[i]);//替换为需要插入的数window[index] = nums[i + k];//向后冒泡while (index < window.length - 1 && window[index] > window[index + 1]) {swap(window, index, index + 1);index++;}//向前冒泡while (index > 0 && window[index] < window[index - 1]) {swap(window, index, index - 1);index--;}res[i + 1] = getMid(window);}return res;
}//交换
private void swap(int[] window, int i, int j) {int temp = window[i];window[i] = window[j];window[j] = temp;
}//求数组的中位数
private double getMid(int[] window) {int len = window.length;if (window.length % 2 == 0) {//避免溢出return window[len / 2] / 2.0 + window[len / 2 - 1] / 2.0;} else {return window[len / 2];}
}//最简单的二分查找
private int search(int[] window, int target) {int start = 0;int end = window.length - 1;while (start <= end) {int mid = start + (end - start) / 2;if (window[mid] > target) {end = mid - 1;} else if (window[mid] < target) {start = mid + 1;} else {return mid;}}return -1;
}

题目来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/distance-between-bus-stops

--------------最后感谢大家的阅读,愿大家技术越来越流弊!--------------

--------------也希望大家给我点支持,谢谢各位大佬了!!!--------------

【每日一题】 480. 滑动窗口中位数相关推荐

  1. leetcode 480. 滑动窗口中位数(堆+滑动窗口)

    中位数是有序序列最中间的那个数.如果序列的大小是偶数,则没有最中间的数:此时中位数是最中间的两个数的平均数. 例如: [2,3,4],中位数是 3 [2,3],中位数是 (2 + 3) / 2 = 2 ...

  2. LeetCode 480. 滑动窗口中位数(大小堆升级版+set实现)

    1. 题目 中位数是有序序列最中间的那个数. 如果序列的大小是偶数,则没有最中间的数:此时中位数是最中间的两个数的平均数. 例如: [2,3,4],中位数是 3 [2,3],中位数是 (2 + 3) ...

  3. LeetCode刷题:滑动窗口模板以及典型例题

    作者:fuxuemingzhu 链接:https://leetcode-cn.com/problems/max-consecutive-ones-iii/solution/fen-xiang-hua- ...

  4. 牛客题霸 [滑动窗口的最大值] C++题解/答案

    牛客题霸 [滑动窗口的最大值] C++题解/答案 题目描述 给定一个数组和滑动窗口的大小,找出所有滑动窗口里数值的最大值.例如,如果输入数组{2,3,4,2,6,2,5,1}及滑动窗口的大小3,那么一 ...

  5. [Swift]LeetCode480. 滑动窗口中位数 | Sliding Window Median

    ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★ ➤微信公众号:山青咏芝(shanqingyongzhi) ➤博客园地址:山青咏芝(https://www.cnblog ...

  6. Leetcode-76:最小覆盖子串(困难题) 滑动窗口法超详细解析

    题目链接 https://leetcode-cn.com/problems/minimum-window-substring/ 题目 给你一个字符串 s .一个字符串 t .返回 s 中涵盖 t 所有 ...

  7. [剑指offer]面试题第[59-1]题[Leetcode][第239题][JAVA][滑动窗口的最大值][单调队列][优先队列]

    [问题描述][困难] [解答思路] 1. 暴力 两层 for 循环,每次都从窗口中找最大值即可 时间复杂度:O(N^2) 空间复杂度:O(N) public int[] maxSlidingWindo ...

  8. leetcode59题:滑动窗口的最大值(用双端队列实现)

    题目描述: 给定一个数组 nums 和滑动窗口的大小 k,请找出所有滑动窗口里的最大值. 示例: 输入: nums = [1,3,-1,-3,5,3,6,7], 和 k = 3 输出: [3,3,5, ...

  9. 快手2020校园招聘秋招笔试--工程C试卷(21题)滑动窗口解决字串

    病毒检测 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32M,其他语言64M 小明最近在做病毒自动检测,他发现,在某些library 的代码段的二进制表示中,如果包含子串并且恰好有 ...

  10. leetcode 滑动窗口

    滑动窗口 文章目录 滑动窗口 模板框架 [76. 最小覆盖子串](https://leetcode-cn.com/problems/minimum-window-substring/) 思路分析 代码 ...

最新文章

  1. NetCore TagHelpers标签
  2. 我有一个竞争方法,让用户去选择你的产品而不是别人
  3. 决策树结合网格搜索交叉验证的例子
  4. MySQL数据库面试题
  5. django+nginx+uwsgi部署web站点
  6. MySQL中Index Condition Pushdown(ICP)优化
  7. typora-setup-x64.exe下载
  8. linux3.10内核支持mpls,将MPLS编译进linux内核中
  9. Error解决:hive中的数组越界异常IndexOutOfBoundsException
  10. 机器学习硕士、博士如何自救?
  11. 大数据架构师指南 pdf_ZTE十年大数据架构师教你:高效搭建企业IT系统架构,超越CTO...
  12. Adboost、GBDT、Xgboost 详解
  13. 解决Delphi 2010启动时卡死并报displayNotification堆栈溢出错误
  14. hdoj小数转化为分数
  15. 2021年的EI会议论文发表难度评价
  16. debian修改字体
  17. 持续集成之企业微信通知:5:在Jenkins中向企业微信推送消息
  18. UDP与IP的不可靠程度是否相同
  19. C#利用绝对值打印菱形
  20. jason数据格式 -- 扫盲

热门文章

  1. WPS表格简单入门_我的笔记_一些常用操作
  2. 统计相关国际期刊汇总
  3. php快递100查询,php采集快递100的快递查询api
  4. 移动端网站优化需要具备哪些条件
  5. 校OJ P1220 -- zyf的现状
  6. 酞菁-氧化石墨烯(NiPc- NHCO-EGO),复合酞菁材料齐岳生物供应
  7. htmla标签下划线去除_div css网页开发布局时a标签去掉下划线
  8. DBeaver——设置字体大小
  9. Shawn邀您共读《WebGL编程指南》| GLSL ES篇
  10. java作品_50幅惊艳的分形艺术作品