[C#] LeetCode 4. Median of Two Sorted Arrays 浅谈中位数

Given two sorted arrays nums1 and nums2 of size m and n respectively, return the median of the two sorted arrays.
https://ithelp.ithome.com.tw/upload/images/20201109/20132436e6K9iQ1MNy.png

意旨找出中位数,在2个已经排序过的阵列里面

我们来看看中位数的定义吧!

简单定义:
一组资料的中位数是指将资料从小到大排序後,最中间的数。

详细定义(可略):

中位数(Median)

关於英文名称:
Medium 形容词 (是形容中等的;中间的)
Median 名词   (除了媒介之外,还有也有中间的意思)

https://ithelp.ithome.com.tw/upload/images/20201109/20132436WbojkexqI5.png
见解:
关於中位数值观上来看就是最中间的数,
那生活上有甚麽应用呢?

    1.     最近沸沸扬扬的美国总统大选(民调)
    2.     计算全国人民的薪资水平
    3.     算同班学生成绩
    
大多数人认知计算成绩、薪资 往往都使用平均法↓↓↓

如 1,2,3,4,5 之平均數与中位數都是 3。
至於对 1,2,3,4,500,平均數为 102。
那一特别大的數 500,让平均數增大不少,但中位數仍为 3,并不受 5 变成 500 之影响。

Q&A:
    哪种方法好呢?
    曾有学者指出 [统计只适合处理大量數据],试图以此消弭一些统计所可能引起的争议。
    但这讲法并不正确,因即使很少量的數据,求平均數,也毫无问题。
    因此统计绝非只适合处理大量數据。而有些民调被认为结果不可靠,关键也并不在於样本數的多寡。
    这样說好了,以美国棒球大聯盟(MLB)球员的年薪來說,有报导說中位數是 470 万美元。
    真的是这样吗?因实际收入可能包含绩效奖金等,且薪水涉及隐私,记者掌握的资料不見得都很可靠
    由於原始數据便可能不精确,这时太在乎细节,就不是那麽必要。
    因此是否真有一个中间位置,是否真能前後各切一半,何须太在意?
    只要是一差不多在中间的值,让人对球员年薪落在那裡,能略有概念就行了。

方向:
解答有很多种实现方法,而中位数会发现几个特点:
* 中位数前面的数字与後面的数字一样多(在偶数元素情况下或相差1)
* 若某个数字前後的数字数量相同(或相差1)则为该数列的中位数
* 删除前N个元素与後N个元素後,中位数不变
* 从大阵列中按顺序任意取走n-1组元素,与剩下的元素共构成n个子列,
每个子列存在中位数:m1,m1...mn,min,max分别为其中最小者与最大者,
则原数列的中位数m满足:min<=m<=max

今天用较为简单的方法处理
1.先将排序好的阵列合并(类似气泡搜寻)
2.在判断奇数或偶数
中位数会有两种情况
* 当输入阵列的个数是奇数时,就取最中间的那个;
* 当输入的数目是偶数时,则要取最中间的那两个加总除以二。
程序码如下

public class Solution {
    public double FindMedianSortedArrays(int[] nums1, int[] nums2) {
        var list1 = new  List<int>(nums1);
        var list2 = new  List<int> (nums2);

        var mergedList= list1.Concat(list2).ToList();

        mergedList.Sort();

        if(mergedList.Count() % 2 == 0)
        {
            int minIndex = mergedList.Count()/2;

            double i = (mergedList[minIndex-1] + mergedList[minIndex])/2.0 ;

            return i;
        }

        else
        {
            int minIndex = mergedList.Count()/2;            
            return mergedList[minIndex];
        }

        return 0;
    }
}

https://ithelp.ithome.com.tw/upload/images/20201109/20132436ElcRXaZbbk.jpg


<<:  JS 逻辑运算子及函式预设值 DAY56

>>:  数字认证(Digital Authentication)

企业资料通讯Week7 (2) | rdt(reliable data transfer)[下]

rdt3.0 rdt3.0 开始考虑到packet loss的情形,它怎麽解决呢? 喔喔~原来是采用...

【Day4】:来使用STM32CubeIDE吧!

程序码导读 点开我们的main.c档案,可以看到里面密密麻麻的注解,第一次看到还真令人害怕,但其实他...

Day03 Filebeat(一) 基本设定

在上一篇中我们已经把elk的环境设定完成,接下来将要收集log到Elasticsearch内,以方便...

Day7 开始使用Git

大家好我是乌木白,今天来和大家介绍如何使用Git,今天的内容会稍微多一点,请大家要多复习喔!! 全...

Android 学习笔记27

继第22篇已经可以绑定fragment跟viewpager那我们就在fragment中加入一些东西吧...