面试训练数组中出现次数超过一半的数字

来源:互联网 发布:汉字翻译拼音软件 编辑:程序博客网 时间:2024/05/16 08:42

题目:数组中有一个数字出现的次数超过了数组长度的一半,找出这个数字。


第一种思路 当然是如果无序的话,先排序O(n logn),然后O(n)遍历数组

第二种思路 当然是取哈希,key为数字,value为出现数字,然后o(n)遍历哈希表


海涛思路

就是只判断前后两个元素的关系,重复利用数组的特性,一个数字出现的次数超过了数组长度的一半。

那么我遍历数组 当后面元素和前面不同 我就计数减1,若相同那么则计数加1,可以知道,最后一个使得计数值从负数变为正数的就是最大值

#include "stdio.h"int findMostNum(int *data,int len){int flag =0;int i;int last,times;last = data[0];times=1;for(i=1;i<len;i++){flag =times;if(times == 0){last = data[i];times=1;}else if(data[i] == last){times+=1;}else{times-=1;}}times =0;for(i=0;i<len;i++){if(data[i] == last){times++;}}if(times*2<=len){return -1;}return last;}int main(){int data[]={1,2,5,7,2,2,5,2,6,2,2,2,2,9};int temp,len;len = sizeof(data)/sizeof(data[0]);temp = findMostNum(data,len);printf("%d\n",temp);return 0;}
据说算法导论有中位数,我还是看看,这个海涛的解决还是感觉有点不太容易想明白