出现次数为某个特定值的问题归类

来源:互联网 发布:淘宝二级域名有什么用 编辑:程序博客网 时间:2024/05/17 23:37

 
一、找出现次数大于n/2的数,即主元素。(也是发帖“水王”问题)

        1.入栈出栈法,O(n)  (推荐)

        将第一个数入栈,遍历后面n-1个数,每个数与栈顶数比较,如果相同则进栈,不同则弹出栈顶元素,最后栈内剩下的一定是次数大于n/2的数。比如1,2,1,3,1,首先1入栈,然后2与栈顶1比较,不相同,于是1出栈,相当于主元素与非主元素相拼,不相同则同归于尽,都丢弃,相同则入栈储存起来,与后面的异己相拼。

        2.芯片测试法,O(n)

        每次两两比较,如果相同则留下一个,不同则都丢弃,轮空元素特殊处理,每次减半,共进行logn轮比较,T(n) = T(n/2) + n/2,根据主定理得出总的时间复杂度为O(n)。

        3.排序法,O(nlogn)

        排序,然后取第n/2个数就是主元素。

        4.中位数法,

        主元素一定是中位数,类似快排思想找出中位数。

二、找出现次数只有1次的数(其他数都出现两次)。 (找出故障机器问题)

        1.异或操作法 O(n)(推荐)

         a1a2⊕a3....⊕an,出现两次的元素都异或没了,最后只剩下出现一次的。

        2.普通记录个数法 O(n)

        遍历数组,在hash表中记录次数。