滑动窗口的中位数
2017年8月7日 19:46:26
难度:困难
描述:给定一个包含 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
;
代码:
class Solution { public List<int> MedianSlidingWindow(int[] nums, int k) { List<int> final = new List<int>(); for (int i = 0; i < nums.Length; i++) { List<int> list = new List<int>(); for(int j=i;j<k+i;j++) { try { list.Add(nums[j]); } catch (Exception)//捕获到异常说明剩余的数字不够k个 { break; } } if (list.Count == k) final.Add(GetMiddleNum(list)); else break; } return final; } public int GetMiddleNum(List<int> list)//获取中位数 { list.Sort(); if (list.Count % 2 != 0) return list[list.Count/2]; else return (list[list.Count/2 ] + list[list.Count/2 - 1]) / 2; } }
今天和昨天的题目中都遇到了关于排序的问题,但是我都用了List<T>的Sort()方法,算是有点投机取巧。下次单独总结一下排序算法。