滑动窗口的中位数

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()方法,算是有点投机取巧。下次单独总结一下排序算法。

原文地址:https://www.cnblogs.com/yh2015/p/7301019.html