zoukankan      html  css  js  c++  java
  • 数字数组查找数组中超过出现次数超过一半的数字(找发帖水王)

    上班之余抽点时间出来写写博文,希望对新接触的朋友有帮助。今天在这里和大家一起学习一下数字数组

        

    标题

        数组中有一个数字涌现的数次过超了数组度长的一半,找出这个数字。 

        

    解决方案:

        1.如果无序,那么我们是不是可以先把数组中所有这些数字进步行排序,至于选取什么排序法方则不在话下,最用常的快速排序ON*logN)可即。排完序呢,直接遍历。在遍历全部数组的同时统计每一个数字的涌现数次,然后把那个涌现数次过超一半的数字直接输出,标题便解答完成了。总的时间复杂度为ON*logN+N)。我们发明,一个数字在数组中的涌现数次过超了一半,那么在排好序的数组引索的N/2(从零开始编号),就一定是这个数字。自此,我们只要需对全部数组排完序后之,然后直接输出数组中的第N/2处的数字可即,这个数字等于全部数组中涌现数次过超一半的数字,总的时间复杂度由于少了最后一次全部数组的遍历,缩小到ON*logN)。

        每日一道理
    俄国作家契诃夫说:“有大狗,有小狗,小狗不该因为大狗的存在而心慌意乱。所有的狗都应该叫,就让他各自用上帝给他的声音。

        2.要缩小总的时间复杂度,那么就用查找时间复杂度为O1),先事预理处时间复杂度为ON)的hash。哈希表的键值(Key)为数组中的数字,值(Value)为该数字对应的数次。然后直接遍历全部hash表,找出个一每数字在对应的位置处涌现的数次,输出那个涌现数次过超一半的数字可即。Hash表要需ON)的销开间空,且要计划hash数函。

        3.如果每次删除两个不同的数(不管是不是我们要查找的那个涌现数次过超一半的数字),那么,在剩下的数中,我们要查找的数(涌现数次过超一半)涌现的数次仍然过超总数的一半。通过一直重复这个进程,一直排掉除其它的数,终最找到那个涌现数次过超一半的数字。这个法方,免去了上述思绪一、二的排序,也避免了思绪三间空ON)的销开,总得说来,时间复杂度只有ON),间空复杂度为O1),不失为佳最法方。

        

        

        

    加强版水王:找出涌现数次刚好是一半的数字 

        关于加强版水王的题我有个法想可以扫描一遍数组就解决问题:

        

            首先,水王占总数的一半,说明总数必为偶数;其次,最后一个元素或者是水王,或者不是水王,因此只要在扫描数组的时候个一每元素都与最后一个元素做比拟,如果相称则最后一个元素的个数加1,否则不理处。如果最后一个元素的个数为N/2,(N为数组元素个数)则它就是水王,否则水王就是面前N-1个元素中选出的candidate。

    文章结束给大家分享下程序员的一些笑话语录: 不会,Intel会维持高利润,也会维持竞争局面,国外的竞争不是打死对方的那种。你看日本有尼康,佳能,索尼,都做相机,大家都过得很滋润。别看一堆厂,其实真正控制的是后面的那几个财团——有些竞争对手,后面其实是一家人。

  • 相关阅读:
    [转]MFC与Qt的内存管理
    [转]QT项目生成流程例图
    [转]vc中nmake.exe cl.exe 的使用
    android_layout_linearlayout(二)
    android_layout_relativelayout(一)
    android_layout_linearlayout(一)
    android_layout_relativelayout(二)
    android_activity_研究(一)
    两个线程解决一个线程卡之路
    android_layout_framelayout
  • 原文地址:https://www.cnblogs.com/jiangu66/p/3055318.html
Copyright © 2011-2022 走看看