【每日一题】 480. 滑动窗口中位数
【每日一题】 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. 滑动窗口中位数相关推荐
- leetcode 480. 滑动窗口中位数(堆+滑动窗口)
中位数是有序序列最中间的那个数.如果序列的大小是偶数,则没有最中间的数:此时中位数是最中间的两个数的平均数. 例如: [2,3,4],中位数是 3 [2,3],中位数是 (2 + 3) / 2 = 2 ...
- LeetCode 480. 滑动窗口中位数(大小堆升级版+set实现)
1. 题目 中位数是有序序列最中间的那个数. 如果序列的大小是偶数,则没有最中间的数:此时中位数是最中间的两个数的平均数. 例如: [2,3,4],中位数是 3 [2,3],中位数是 (2 + 3) ...
- LeetCode刷题:滑动窗口模板以及典型例题
作者:fuxuemingzhu 链接:https://leetcode-cn.com/problems/max-consecutive-ones-iii/solution/fen-xiang-hua- ...
- 牛客题霸 [滑动窗口的最大值] C++题解/答案
牛客题霸 [滑动窗口的最大值] C++题解/答案 题目描述 给定一个数组和滑动窗口的大小,找出所有滑动窗口里数值的最大值.例如,如果输入数组{2,3,4,2,6,2,5,1}及滑动窗口的大小3,那么一 ...
- [Swift]LeetCode480. 滑动窗口中位数 | Sliding Window Median
★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★ ➤微信公众号:山青咏芝(shanqingyongzhi) ➤博客园地址:山青咏芝(https://www.cnblog ...
- Leetcode-76:最小覆盖子串(困难题) 滑动窗口法超详细解析
题目链接 https://leetcode-cn.com/problems/minimum-window-substring/ 题目 给你一个字符串 s .一个字符串 t .返回 s 中涵盖 t 所有 ...
- [剑指offer]面试题第[59-1]题[Leetcode][第239题][JAVA][滑动窗口的最大值][单调队列][优先队列]
[问题描述][困难] [解答思路] 1. 暴力 两层 for 循环,每次都从窗口中找最大值即可 时间复杂度:O(N^2) 空间复杂度:O(N) public int[] maxSlidingWindo ...
- leetcode59题:滑动窗口的最大值(用双端队列实现)
题目描述: 给定一个数组 nums 和滑动窗口的大小 k,请找出所有滑动窗口里的最大值. 示例: 输入: nums = [1,3,-1,-3,5,3,6,7], 和 k = 3 输出: [3,3,5, ...
- 快手2020校园招聘秋招笔试--工程C试卷(21题)滑动窗口解决字串
病毒检测 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32M,其他语言64M 小明最近在做病毒自动检测,他发现,在某些library 的代码段的二进制表示中,如果包含子串并且恰好有 ...
- leetcode 滑动窗口
滑动窗口 文章目录 滑动窗口 模板框架 [76. 最小覆盖子串](https://leetcode-cn.com/problems/minimum-window-substring/) 思路分析 代码 ...
最新文章
- NetCore TagHelpers标签
- 我有一个竞争方法,让用户去选择你的产品而不是别人
- 决策树结合网格搜索交叉验证的例子
- MySQL数据库面试题
- django+nginx+uwsgi部署web站点
- MySQL中Index Condition Pushdown(ICP)优化
- typora-setup-x64.exe下载
- linux3.10内核支持mpls,将MPLS编译进linux内核中
- Error解决:hive中的数组越界异常IndexOutOfBoundsException
- 机器学习硕士、博士如何自救?
- 大数据架构师指南 pdf_ZTE十年大数据架构师教你:高效搭建企业IT系统架构,超越CTO...
- Adboost、GBDT、Xgboost 详解
- 解决Delphi 2010启动时卡死并报displayNotification堆栈溢出错误
- hdoj小数转化为分数
- 2021年的EI会议论文发表难度评价
- debian修改字体
- 持续集成之企业微信通知:5:在Jenkins中向企业微信推送消息
- UDP与IP的不可靠程度是否相同
- C#利用绝对值打印菱形
- jason数据格式 -- 扫盲