滑动窗口的中位数
来源:互联网 发布:常用的nosql数据库 编辑:程序博客网 时间:2024/06/04 23:37
给定一个包含 n 个整数的数组,和一个大小为 k 的滑动窗口,从左到右在数组中滑动这个窗口,找到数组中每个窗口内的中位数。(如果数组个数是偶数,则在该窗口排序数字后,返回第 N/2 个数字。)
样例
对于数组 [1,2,7,8,5]
, 滑动大小 k = 3 的窗口时,返回 [2,7,7]
最初,窗口的数组是这样的:
[ | 1,2,7 | ,8,5]
, 返回中位数 2
;
接着,窗口继续向前滑动一次。
[1, | 2,7,8 | ,5]
, 返回中位数 7
;
接着,窗口继续向前滑动一次。
[1,2, | 7,8,5 | ]
, 返回中位数 7
;
import java.util.*;/** * Created by wb-xzc291800 on 2017/6/30. */public class Solution { int mid = 0; /** * @param nums: A list of integers. * @return: The median of the element inside the window at each moving. */ public ArrayList<Integer> medianSlidingWindow(int[] nums, int k) { mid = getMid(k); ArrayList<Integer> a = new ArrayList<Integer>(); if (k == 0 || nums.length < mid) { return a; } else if (nums.length == mid || (nums.length > mid && nums.length < k)) { a.add(nums[mid - 1]); return a; } else if (1 == k) { for (int i : nums) { a.add(i); } return a; } else if (2 == k) { for (int i = 0; i < nums.length - 1; i++) { if (nums[i] > nums[i + 1]) { a.add(nums[i + 1]); } else { a.add(nums[i]); } } return a; } LinkedList<Integer> sub = subArray(nums, k); a.add(sub.get(mid - 1)); for (int i = k; i < nums.length; i++) { start = 0; end = 0; insert(sub, nums[i]); sub.remove(sub.indexOf(nums[i - k])); a.add(sub.get(mid - 1)); } return a; } int getMid(int k) { int mid = 0; if (k % 2 == 1) { mid = (k + 1) / 2; } else { mid = k / 2; } return mid; } /** * 截取首个视窗数组,并且排序 * @param nums * @param k * @return */ LinkedList<Integer> subArray(int[] nums, int k) { LinkedList<Integer> ret = new LinkedList<Integer>(); for (int i = 0; i < k; i++) { ret.add(nums[i]); } Collections.sort(ret); return ret; } int start = 0; int end = 0; /** * 二分法查找插入值 * @param linkedList * @param val */ void insert(LinkedList<Integer> linkedList, int val) { if (end == 0) { end = linkedList.size() - 1; } if (end - start <= 1) { if (linkedList.get(start) >= val) { linkedList.add(start, val); return; } if (linkedList.get(end) <= val || end == linkedList.size()) { linkedList.addLast(val); return; } linkedList.add(end,val); return; } int mid = (start + end) / 2; int x = linkedList.get(mid); if (x > val) { end = mid; } else { start = mid; } insert(linkedList, val); }}
阅读全文
0 0
- 滑动窗口的中位数
- 找滑动窗口的中位数
- 滑动窗口的中位数-LintCode
- LintCode之滑动窗口的中位数
- 小探索--LintCode 滑动窗口的中位数
- LINTCODE——滑动窗口的中位数
- [LeetCode] Sliding Window Median 滑动窗口中位数
- leetcode 480. Sliding Window Median 滑动窗口中位数
- 滑动窗口的原理
- 滑动窗口的最大值
- 滑动窗口的最大值
- 滑动窗口的最大值
- 滑动窗口的最大值
- 滑动窗口的最大值
- 滑动窗口的最大值
- 滑动窗口的最大值
- 滑动窗口的最大值
- 滑动窗口的最大值
- javascript之面向对象编程续
- Unity3d 序列目标点的移动
- 【剑指offer】题32:从1到n整数中1出现的次数
- spring 整合 redis,以及spring的RedisTemplate如何使用
- Python中join的简单用法
- 滑动窗口的中位数
- Hibernate学习笔记(二)
- 51nod 1675 序列变换
- 解决three.js加载外部obj文件在chrome浏览器中无法显示的问题
- Java的三种代理模式
- iOS开发知识总结
- 2017上海国际人工智能可持续发展高峰论坛7月30日上海召开
- Android 按钮的点击事件实现1
- c++ 基础知识