求数组中出现次数超过一半的元素 给定一个含有n个元素的整型数组a,其中有个元素出现次数超过n/2,求出这个元素。据说是百度的一道题。 分析 暂且先不说当前作者的思路,我看到这个问题的时候,想到了如下方法: 1. 先进行排序,常规的方法就是快速排序,平均时间复杂度为O(nlogn)),然后取第n/2个元素即可,当然,这种方法的前提是存在这个所谓的“主元素”;若不清楚,还是需要验证的; 2. 由于肯定该数组中含有这么个元素,该题就转换为找中位数了。找中位数的方法线性时间内有两种:第一、基于分治法的线性期望时间求中位数,该方法是线性期望时间,类似于快速排序;第二、最坏情况下也是线性时间复杂度的方法——“五分中项的中项”划分方法; 3、分治的思想 若a中存在主元素,则将a分为两部分后,a的主元素也必为两部分中至少一部分主元素,因此可用分治法。 将元素划分两部分,递归地检查两部分有无主元素。算法如下: a. 若a中只含有一个元素,则此元素就是主元素,返回此数; b. 将a分为两部分a1和a2(二者元素相等或只差一个),分别递归调用此方法求其主元素m1和m2; c. 若m1和m2都存在且相等,则这个是就是a的主元素,返回次数; d. 若m1和m2都存在且不相等,则分别检查这两个数是否为a的主元素,若有则返回此数,若无则返回空值; e. 若m1和m2都不存在,则a无主元素,返回空值; f. 若m1和m2只有一个存在,则检查这个数是否为a的主元素,若是则返回此数,若否就返回空值;