上班之余抽点时间出来写写博文,希望对新接触的朋友有帮助。今天在这里和大家一起学习一下数字数组
标题
数组中有一个数字涌现的数次过超了数组度长的一半,找出这个数字。
解决方案:
1.如果无序,那么我们是不是可以先把数组中所有这些数字进步行排序,至于选取什么排序法方则不在话下,最用常的快速排序O(N*logN)可即。排完序呢,直接遍历。在遍历全部数组的同时统计每一个数字的涌现数次,然后把那个涌现数次过超一半的数字直接输出,标题便解答完成了。总的时间复杂度为O(N*logN+N)。我们发明,一个数字在数组中的涌现数次过超了一半,那么在已排好序的数组引索的N/2处(从零开始编号),就一定是这个数字。自此,我们只要需对全部数组排完序后之,然后直接输出数组中的第N/2处的数字可即,这个数字等于全部数组中涌现数次过超一半的数字,总的时间复杂度由于少了最后一次全部数组的遍历,缩小到O(N*logN)。
2.要缩小总的时间复杂度,那么就用查找时间复杂度为O(1),先事预理处时间复杂度为O(N)的hash表。哈希表的键值(Key)为数组中的数字,值(Value)为该数字对应的数次。然后直接遍历全部hash表,找出个一每数字在对应的位置处涌现的数次,输出那个涌现数次过超一半的数字可即。Hash表要需O(N)的销开间空,且要计划hash数函。
3.如果每次删除两个不同的数(不管是不是我们要查找的那个涌现数次过超一半的数字),那么,在剩下的数中,我们要查找的数(涌现数次过超一半)涌现的数次仍然过超总数的一半。通过一直重复这个进程,一直排掉除其它的数,终最找到那个涌现数次过超一半的数字。这个法方,免去了上述思绪一、二的排序,也避免了思绪三间空O(N)的销开,总得说来,时间复杂度只有O(N),间空复杂度为O(1),不失为佳最法方。
加强版水王:找出涌现数次刚好是一半的数字
关于加强版水王的题我有个法想可以扫描一遍数组就解决问题:
首先,水王占总数的一半,说明总数必为偶数;其次,最后一个元素或者是水王,或者不是水王,因此只要在扫描数组的时候个一每元素都与最后一个元素做比拟,如果相称则最后一个元素的个数加1,否则不理处。如果最后一个元素的个数为N/2,(N为数组元素个数)则它就是水王,否则水王就是面前N-1个元素中选出的candidate。
文章结束给大家分享下程序员的一些笑话语录:
不会,Intel会维持高利润,也会维持竞争局面,国外的竞争不是打死对方的那种。你看日本有尼康,佳能,索尼,都做相机,大家都过得很滋润。别看一堆厂,其实真正控制的是后面的那几个财团——有些竞争对手,后面其实是一家人。