九章算法面试题14 超过一半的数
2015-05-12 13:31
267 查看
九章算法官网-原文网址
http://www.jiuzhang.com/problem/14/题目
初阶:有N个数,其中一个数的出现次数严格超过了一半。求这个数。进阶1:有N个数,其中两个数的出现次数都超过了⅓ ,求这两个数。
进阶2:有N个数,其中一个数的出现次数严格超过了⅓,并且没有第二个这样的数。求这个数。
以上两问均要求O(n)的时间复杂度和O(1)的额外空间复杂度。
解答
初阶:抵消法。如果两个数不一样,扔掉这两个数,剩下来的数中,要找的数的出现次数仍然会超过一半。所以整个过程中只需要保存一个数,及其出现次数即可。进阶1:仍然是抵消法。如果三个数不一样,就三个数都扔掉。因此记录2个数,及其各自出现次数即可。
进阶2:沿用进阶1的算法。如果最后剩下1个数,那么就是答案了;如果剩下2个数,重新扫描这N个数,统计这两个数的出现次数则可以得到答案。
面试官角度
初阶问题是著名的芯片测试问题的另一个版本。一般来讲大学的算法课上都会讲到。主要考察的是算法基本功底。进阶1和进阶2都是需要想办法利用初阶问题的思路去解决,如果只是背下了初阶问题的解答没有真正理解,进阶问题就无法回答出来。进阶2在回答的时候需要和面试官沟通是否可以再扫描一遍数组。
相关文章推荐
- 程序员面试题精选100题(47)-数组中出现次数超过一半的数字[算法]
- 算法题005 剑指Offer面试题29 数组中出现次数超过一半的数字
- 程序员面试题精选100题(47)-数组中出现次数超过一半的数字[算法]
- 剑指offer面试题29:数组中出现次数超过一半的数字
- 面试题29:数组中出现次数超过一半的数字
- 九章算法 | Facebook 面试题 : Backpack VI 背包算法
- 九章算法面试题80 接雨水
- 【算法22】寻找数组中出现次数超过一半的数字
- 九章算法面试题77 插入区间
- 九章算法面试题6 负载均衡
- 九章算法面试题18 复制链表
- 九章算法面试题33 数组波峰
- 已知一个数出现的次数超过了一半,请用O(n)的复杂度的算法找出这个数。
- 九章算法面试题56 最近公共祖先
- 左神算法课-找出数组中出现次数超过一半的数及其进阶
- 剑指offer之面试题29数组中出现次数超过一半的数字
- 数组中出现次数超过一半的数字[算法]
- 面试题29 :数组中出现次数超过一半的数字
- PHP实现找出数组中出现次数超过数组长度一半的数字算法示例
- 九章算法面试题73 翻转链表II