博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
(剑指Offer)面试题29:数组中出现次数超过一半的数字
阅读量:5154 次
发布时间:2019-06-13

本文共 2692 字,大约阅读时间需要 8 分钟。

题目:

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

例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}。由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2。

思路:

1、方法1:

先排序,然后找中位数;

时间复杂度O(nlogn)

2、方法2:

基于Partition函数的O(n)算法,即寻找第k(k=n/2)大的数;

平均时间复杂度:O(n)

3、方法3:

根据数组特点,采用Moore-Vote方法。

由于该数字的出现次数比所有其他数字出现次数的和还要多,因此可以考虑在遍历数组时保存两个值:一个是数组中的一个数字,一个是次数,。当遍历到下一个数字时,如果下一个数字与之前保存的数字相同,则次数加1,如果不同,则次数减1,如果次数为0,则需要保存下一个数字,并把次数设定为1。由于我们要找的数字出现的次数比其他所有数字的出现次数之和还要大,则要找的数字肯定是组后一次把次数设为1时对应的数字。

时间复杂度为O(n),空间复杂度为O(1)。

代码:

方法2:

#include 
using namespace std;bool g_bInputInvalid=false;bool CheckInvalidArray(int* numbers,int length){ if(numbers==NULL || length<=0) g_bInputInvalid=true; return g_bInputInvalid;}bool CheckMoreThanHalf(int* numbers,int length,int number){ int times=0; for(int i=0;i
=key) --j; if(i
>1; int start=0; int end=length-1; int index=Partition(numbers,start,end); while(index!=mid){ if(index>mid){ end=index-1; index=Partition(numbers,start,end); } else{ start=index+1; index=Partition(numbers,start,end); } } int result=numbers[index]; if(!CheckMoreThanHalf(numbers,length,result)) result=0; return result;}int main(){ int A[]={3,1,3,2,4,3,3,5,3,7,3}; int length=sizeof(A)/sizeof(A[0]); cout << MoreThanHalfNum(A,length) << endl; return 0;}

方法3:

#include 
using namespace std;bool g_bInputInvalid=false;bool CheckInvalidArray(int* numbers,int length){ if(numbers==NULL || length<=0) g_bInputInvalid=true; return g_bInputInvalid;}bool CheckMoreThanHalf(int* numbers,int length,int number){ int times=0; for(int i=0;i

在线测试OJ:

http://www.nowcoder.com/books/coding-interviews/e8a1b01a2df14cb2b228b30ee6a92163?rp=2

AC代码:

方法1:

class Solution {public:    int Partition(vector
&numbers,int start,int end){ int key=numbers[start]; int i=start; int j=end; while(i
=key) --j; if(i
numbers) { int length=numbers.size(); if(length<=0) return 0; int mid=length>>1; int start=0; int end=length-1; int index=Partition(numbers,start,end); while(index!=mid){ if(index>mid){ end=index-1; index=Partition(numbers,start,end); } else{ start=index+1; index=Partition(numbers,start,end); } } int result=numbers[index]; int times=0; for(int i=0;i

方法2:

class Solution {public:    int MoreThanHalfNum_Solution(vector
numbers) { int length=numbers.size(); if(length<=0) return 0; int result=numbers[0]; int times=1; for(int i=1;i

转载于:https://www.cnblogs.com/AndyJee/p/4662366.html

你可能感兴趣的文章
Django基于admin的stark组件创建(一)
查看>>
快速幂 模板及应用
查看>>
批处理/DOS命令删除文件夹下某类型的文件
查看>>
模板 - 数学 - 矩阵快速幂
查看>>
优秀的持久层框架Mybatis,连接数据库快人一步
查看>>
线段树 延迟更新
查看>>
PAT L2-016 愿天下有情人都是失散多年的兄妹
查看>>
抛弃IIS,利用FastCGI让Asp.net与Nginx在一起
查看>>
C. Tanya and Toys_模拟
查看>>
使用SwingWork反而阻塞SwingUI
查看>>
Windchill中如何扩展字段长度?
查看>>
pytorch中的forward前向传播机制
查看>>
课后作业-阅读任务-阅读提问-4
查看>>
Delphi 深入浅出VCL(2)-TObject所有对象的根
查看>>
配置IIS虚拟目录遇到的5个问题
查看>>
2-03顺序表的操作
查看>>
耿丹CS16-2班第一次作业汇总
查看>>
查看mysql表大小
查看>>
命令行程序测试自动化
查看>>
My Blog
查看>>