牛客网----2016腾讯,,微信红包
2017-07-29 11:08
169 查看
时间限制:3秒空间限制:32768K春节期间小明使用微信收到很多个红包,非常开心。在查看领取红包记录时发现,某个红包金额出现的次数超过了红包总数的一半。请帮小明找到该红包金额。写出具体算法思路和代码实现,要求算法尽可能高效。给定一个红包的金额数组gifts及它的大小n,请返回所求红包的金额。若没有金额超过总数的一半,返回0。测试样例:
[1,2,3,2,2],5
返回:2
代码如下:
class Gift { public: int getValue(vector<int> gifts, int n) { // write code here if(gifts.size() == 0 || n <= 0) return 0; int data = gifts[0]; int times = 1; for(int i = 1; i < n; ++i) { if(gifts[i] == data) { ++times; } else { --times; if(times == 0) { data = gifts[i]; times = 1; } } } int c = 0; for(int i = 0; i < n; ++i) { if(gifts[i] == data) ++c; } if(c >= n/2) { return data; } else return 0; } };
思路:这是一个求数组中出现次数超过一半的数字的题。在剑指offer上有的。剑指offer上提供了两种思路,一个是使用快速排序中的partition,另一个思路使用统计次数。当然最后还要进行核对。两种思路的时间复杂度都是O(n).
但是使用快速排序中的partition的算法改变了原始数组。
使用统计次数的算法没有改变原数组。
相关文章推荐
- 牛客网---2016---腾讯微信红包
- 微信红包(腾讯2016研发工程师编程题)
- 微信红包(数组中出现次数超过一半的数字)----腾讯2016研发工程师编程题
- 2016腾讯编程题:微信红包
- 2016校招真题编程练习——微信红包(腾讯)
- 腾讯2016研发工程师编程题——微信红包
- 腾讯2016研发工程师编程题(二)----微信红包
- 腾讯2016笔试题-微信红包-找出数组中过半数的数字
- 腾讯2016笔试题-微信红包-找出数组中过半数的数字
- 腾讯2016笔试题-微信红包-找出数组中过半数的数字
- 名企笔试:腾讯2016招聘笔试(微信红包)
- 算法与数据结构——算法题 21:微信红包(2016腾讯校招笔试题) ? 待解决
- 微信红包(2016腾讯校招笔试题)
- 腾讯2016研发工程师编程题微信红包
- 接上一篇腾讯2016年微信红包编程题
- [腾讯校招] 微信红包
- 腾讯2016笔试题-红包
- 牛客网--腾讯2016,最长回文串
- 腾讯笔试题 微信红包
- 腾讯-微信红包 腾讯-生成格雷码