Java实现 LeetCode 480 滑动窗口中位数
480. 滑动窗口中位数
中位数是有序序列最中间的那个数。如果序列的大小是偶数,则没有最中间的数;此时中位数是最中间的两个数的平均数。
例如:
[2,3,4],中位数是 3
[2,3],中位数是 (2 + 3) / 2 = 2.5
给你一个数组 nums,有一个大小为 k 的窗口从最左端滑动到最右端。窗口中有 k 个数,每次窗口向右移动 1 位。你的任务是找出每次窗口移动后得到的新窗口中元素的中位数,并输出由它们组成的数组。
示例:
给出 nums = [1,3,-1,-3,5,3,6,7],以及 k = 3。
窗口位置 中位数
[1  3  -1] -3  5  3  6  7       1
1 [3  -1  -3] 5  3  6  7      -1
1  3 [-1  -3  5] 3  6  7      -1
1  3  -1 [-3  5  3] 6  7       3
1  3  -1  -3 [5  3  6] 7       5
1  3  -1  -3  5 [3  6  7]      6
因此,返回该滑动窗口的中位数数组 [1,-1,-1,3,5,6]。
提示:
你可以假设 k 始终有效,即:k 始终小于输入的非空数组的元素个数。
与真实值误差在 10 ^ -5 以内的答案将被视作正确答案。
PS:
其实也就是排序,只不过我以后的排序都是二分排序,我的排序数组就是k大小
class Solution {
       public double[] medianSlidingWindow(int[] nums, int k) {
        int len = nums.length - k + 1;
        double[] res = new double[len];
        int[] arr = Arrays.copyOfRange(nums, 0, k);
        Arrays.sort(arr);
        for (int i = 0; i < len; i++) {
            if (k % 2 == 0) {
                res[i] = (0.00 + arr[k/2] + arr[k/2-1]) / 2;
            } else {
                res[i] = arr[k/2];
            }
            if (i == len - 1) break;
            update(arr, nums[i], nums[i + k]);
        }
        return res;
    }
    void update(int[] arr, int rm, int add) {
        if (rm == add) return;
        int idx = Arrays.binarySearch(arr, rm);
        int i = 0;
        if (add > rm) {
            for (i = idx; i < arr.length - 1; i++) {
                if (arr[i+1] >= add) break;
                arr[i] = arr[i+1];
            }
        } else {
            for (i = idx; i > 0; i--) {
                if (arr[i - 1] <= add) break;
                arr[i] = arr[i-1];
            }
        }
        arr[i] = add;
    }
}
												
											Java实现 LeetCode 480 滑动窗口中位数的更多相关文章
- Leetcode 480.滑动窗口中位数
		
滑动窗口中位数 中位数是有序序列最中间的那个数.如果序列的大小是偶数,则没有最中间的数:此时中位数是最中间的两个数的平均数. 例如: [2,3,4],中位数是 3 [2,3],中位数是 (2 + 3) ...
 - LeetCode295-Find Median from Data Stream && 480. 滑动窗口中位数
		
中位数是有序列表中间的数.如果列表长度是偶数,中位数则是中间两个数的平均值. 例如, [2,3,4] 的中位数是 3 [2,3] 的中位数是 (2 + 3) / 2 = 2.5 设计一个支持以下两种操 ...
 - 【LeetCode】480. 滑动窗口中位数 Sliding Window Median(C++)
		
作者: 负雪明烛 id: fuxuemingzhu 公众号: 每日算法题 本文关键词:LeetCode,力扣,算法,算法题,滑动窗口,中位数,multiset,刷题群 目录 题目描述 题目大意 解题方 ...
 - Java实现 LeetCode 239 滑动窗口最大值
		
239. 滑动窗口最大值 给定一个数组 nums,有一个大小为 k 的滑动窗口从数组的最左侧移动到数组的最右侧.你只可以看到在滑动窗口内的 k 个数字.滑动窗口每次只向右移动一位. 返回滑动窗口中的最 ...
 - 【Leetcode 二分】 滑动窗口中位数(480)
		
题目 中位数是有序序列最中间的那个数.如果序列的大小是偶数,则没有最中间的数:此时中位数是最中间的两个数的平均数. 例如: [2,3,4],中位数是 3 [2,3],中位数是 (2 + 3) / 2 ...
 - [LeetCode] Sliding Window Median 滑动窗口中位数
		
Median is the middle value in an ordered integer list. If the size of the list is even, there is no ...
 - Leetcode 239.滑动窗口最大值
		
滑动窗口最大值 给定一个数组 nums,有一个大小为 k 的滑动窗口从数组的最左侧移动到数组的最右侧.你只可以看到在滑动窗口 k 内的数字.滑动窗口每次只向右移动一位. 返回滑动窗口最大值. 示例: ...
 - 【leetcode 239. 滑动窗口最大值】解题报告
		
思路:滑动窗口的思想,只要是求连续子序列或者子串问题,都可用滑动窗口的思想 方法一: vector<int> maxSlidingWindow(vector<int>& ...
 - leetcode 239. 滑动窗口最大值(python)
		
1. 题目描述 给定一个数组 nums,有一个大小为 k 的滑动窗口从数组的最左侧移动到数组的最右侧.你只可以看到在滑动窗口内的 k 个数字.滑动窗口每次只向右移动一位. 返回滑动窗口中的最大值. 示 ...
 
随机推荐
- Linux Kernel Makefiles Kbuild en
			
来自Linux kernel docs,顺便整理了一下排版 Linux Kernel Makefiles This document describes the Linux kernel Makefi ...
 - JDBC01 mysql和navicat的安装
			
navicat的安装 从网上下载的,详细过程,略 mysql8.0.11(win10,64)安装 1.下载 MySQL8.0 For Windows zip包下载地址:https://dev.mysq ...
 - [ACdream 1212 New Year Bonus Grant]贪心
			
题意:员工之间形成一棵树,上级可以给下级发奖金,任何一个人最多可以给一个下级发,并且发了奖金后就不能接受奖金.求总共最多可以产生多少的奖金流动 思路:每次选择没有下级并且有上级的员工a,令它的上级为b ...
 - 这份书单会告诉你,Java网络编程其实很重要
 - ASP.NET Core Blazor 初探之 Blazor Server
			
上周初步对Blazor WebAssembly进行了初步的探索(ASP.NET Core Blazor 初探之 Blazor WebAssembly).这次来看看Blazor Server该怎么玩. ...
 - 集群、分布式、SOA、微服务、webService等思想的整理
			
引子:前几天甲方问我,他用wpf弄个界面,能不能通过其他语言给他传输数据,我由此想到了webservice(此时此刻,我也没有用过webServices),作日翻阅了一些资料,对这块技术有了个大概的了 ...
 - javaEE ->DBUtils&连接池
			
第1章 DBUtils 如果只使用JDBC进行开发,我们会发现冗余代码过多,为了简化JDBC开发,本案例我们讲采用apache commons组件一个成员:DBUtils. DBUtils就是J ...
 - css3及css技巧
			
左右对齐:
 - POJ2516
			
题目链接:http://poj.org/problem?id=2516 解题思路: 最小费用最大流,这个没什么疑问.但此题小难点在于读题,大难点在于建图. 首先,供应量小于需求量的时候直接输出“-1” ...
 - 求平均成绩(hdu2023)
			
注意:要心细,不要错在小细节上.如int c[6];double agve; c[j]=agve:这是错误的. #include<stdio.h> #include<cmath> ...