剑指offer—数组中出现次数超过一半的数字
2015-10-04 11:24
531 查看
华电北风吹
天津大学认知计算与应用重点实验室
日期:2015/10/4
题目描述
数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}。由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2。
解析:对数组进行两次遍历,第一次找出唯一可能是超过数组长度一半的数字,第二次遍历进行验证。对于 第一步有很多实现。可以每次都采用删除两个不相同的数字,知道最后一个或者两个。也可以采用抵消计数(若出现一个不同的数字计数减一,下面代码1)
C++ lambda表达式解法:
天津大学认知计算与应用重点实验室
日期:2015/10/4
题目描述
数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}。由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2。
解析:对数组进行两次遍历,第一次找出唯一可能是超过数组长度一半的数字,第二次遍历进行验证。对于 第一步有很多实现。可以每次都采用删除两个不相同的数字,知道最后一个或者两个。也可以采用抵消计数(若出现一个不同的数字计数减一,下面代码1)
class Solution { public: int MoreThanHalfNum_Solution(vector<int> numbers) { int n = numbers.size(); if (n == 0) return 0; int num = numbers[0], count = 1; for (int i = 1; i < n; i++) { if (numbers[i] == num) count++; else count--; if (count == 0) { num = numbers[i]; count = 1; } } count = 0; for (int i = 0; i < n; i++) { if (numbers[i] == num) count++; } if (count * 2 > n) return num; return 0; } };
C++ lambda表达式解法:
class Solution { public: int MoreThanHalfNum_Solution(vector<int> numbers) { if (numbers.empty()) return NULL; int result=*find_if(numbers.begin(), numbers.end(), [numbers](int x) { return (count(numbers.begin(), numbers.end(), x) * 2) > numbers.size(); }); return result; } };
相关文章推荐
- [leetcode-289]Game of Life(java)
- 代码:css小图标
- html小需求——科技文章展示
- POJ 3905 Perfect Election(2-SAT)
- nodejs express hi-cms
- 推荐10 个很棒的 jQuery 特效代码
- 五个有用的jquery小技巧
- CCRenderBuffer初始化中的render state参数
- CCRenderBuffer初始化中的render state参数
- CCRenderBuffer初始化中的render state参数
- 14个实用的CSS在线实例教程
- 剑指offer—字符串的排列
- LeetCode "Game of Life"
- jQuery插件Timelinr 实现时间轴特效
- 自定义tableview Header和Footer的样式
- META
- 剑指offer—二叉搜索树与双向链表
- jquery 实现输入邮箱时自动补全下拉提示功能
- React Native 开始
- HTML5学习之二:HTML5中的表单1