剑指offer-29数组中出现次数超过一半的数字
来源:互联网 发布:淘宝金币流量 编辑:程序博客网 时间:2024/06/06 04:32
题目:数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}。由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2。如果不存在则输出0。
拿到题目的第一反应是将数组排序,然后判断数组中间的数字长度是否超过数组长度的一半。若数组中出现最多次数的数字为0且长度超过数组的一半时,输出也为0,该怎么判断是存在数字0超过一半长度还是不存在超过一半长度的数字?可以添加一个布尔全局变量,若是存在数字0且长度超过数组长度的一半,将该变量设为true,否则为false,最后根据输出的数字和全局变量共同判断是否存在超过数组长度一般的数字。
<pre name="code" class="cpp">class Solution {public:bool InValid=false; int MoreThanHalfNum_Solution(vector<int> numbers) { sort(numbers.begin(),numbers.end()); int num=0; int n=numbers.size(); for(int iter=0;iter<(n+1)/2;iter++) { if (numbers[iter]==numbers[iter+n/2]) { num=numbers[iter]; InValid=true; break; } } return num; }};
排序的时间复杂度是O(nlogn),有没有更快的算法呢?
假设数组中有一个数字出现次数比其他所有数字出现的次数都多,可以在遍历数组的时候保存2个值,一个是数字,一个是次数,遍历移到下一个数字时,若与前面相同,次数+1,若不同次数-1,如果次数为0,则保存下一个数字并设置次数为1,要找的数字次数比其他所有数字的次数都多,那么要找的数字一定是最后一次将次数设为1时对应的数字。
<pre name="code" class="cpp"><pre name="code" class="cpp">class Solution {public: bool InValid=false; int MoreThanHalfNum_Solution(vector<int> number) { if(number.empty()) return 0; int result; int times=0; for(int i=0;i<number.size();++i) { if(times==0) { result=number[i]; times=1; } else if(number[i]==result) ++times; else --times; } int count=0; for(int j=0;j<number.size();++j) { if(number[j]==result) count++; } if(2*count>number.size()) InValid=true; return 2*count>number.size()?result:0; }};
这个只需遍历2次数组,因此时间复杂度为O(logn)。
0 0
- 剑指offer--数组中出现次数超过一半的数字
- 《剑指offer》数组中出现次数超过一半的数字
- 剑指offer:数组中出现次数超过一半的数字
- 【剑指Offer】数组中出现次数超过一半的数字
- 剑指offer:数组中出现次数超过一半的数字
- 数组中出现次数超过一半的数字||剑指offer
- 剑指offer 数组中出现次数超过一半的数字
- 剑指offer:数组中出现次数超过一半的数字
- [剑指offer]数组中出现次数超过一半的数字
- 《剑指offer》-数组中出现次数超过一半的数字
- 剑指offer|数组中出现次数超过一半的数字
- 剑指offer-数组中出现次数超过一半的数字
- 《剑指offer》数组中出现次数超过一半的数字
- 剑指offer - 数组中出现次数超过一半的数字
- 剑指Offer:数组中出现次数超过一半的数字
- 剑指offer-数组中出现次数超过一半的数字
- 剑指offer:数组中出现次数超过一半的数字
- 剑指offer 数组中出现次数超过一半的数字
- C++模板小例
- branch网站与客户端同步
- Android Intent demo
- leetcode 74. Search a 2D Matrix-矩阵搜索|二分查找
- JAVA多线程之生产者消费者模型
- 剑指offer-29数组中出现次数超过一半的数字
- 图像的去模糊
- Mars-HTML5(三)常用文本标签
- UGUI 滚动优化之 隐藏视口外的GameObject
- 动态规划算法总结
- 11、python标准库概览
- tar命令基本用法
- linear_regression
- 二叉树的创建与前序遍历(递归方式)