面试题29 数组中出现次数超过一半的数字


方法一:先对数组进行排序,再遍历排序后的数组,统计每个数的次数,出现次数最大的数即为要找的数

时间复杂度  O(nlogn) + O(n) = O(nlogn)

不需要额外存储空间

方法二:先对数组进行排序,出现次数超过数组长度的一半的数必然是数组中间的那个数

时间复杂度O(nlgn)+ O(1)= O(nlgn)

不需要额外存储空间

方法三:不排序扫描一遍数组,每次删除两个不同的数,最终得到那个数即为要找的数

时间复杂度On

空间复杂度O(1) 

代码:

[cpp]  view plain copy
  1. #include "stdafx.h"  
  2. #include <iostream>  
  3. using namespace std;  
  4.   
  5. //找出数组中出现次数超过一半的数字,找到则返回true,否则返回fasle  
  6. bool FindHalfCountNum(int nArr[], int nLength, int &nNum)  
  7. {  
  8.     if (nArr==NULL || nLength<=0)  
  9.     {  
  10.         return false;  
  11.     }  
  12.   
  13.     int nCandidate = nArr[0];  
  14.     int nCount = 1;  
  15.     for (int i=1; i<nLength; i++)  
  16.     {  
  17.         if (nCount == 0)  
  18.         {  
  19.             nCandidate = nArr[i];  
  20.             nCount = 1;  
  21.         }  
  22.         else  
  23.         {  
  24.             if (nCandidate != nArr[i])  
  25.             {  
  26.                 nCount--;  
  27.             }  
  28.             else  
  29.             {  
  30.                 nCount++;  
  31.             }  
  32.         }  
  33.     }  
  34.   
  35.     nNum = nCandidate;  
  36.   
  37.     nCount = 0;  
  38.     for (int j=0; j<nLength; j++)  
  39.     {  
  40.         if (nArr[j] == nNum)  
  41.         {  
  42.            nCount++;  
  43.         }  
  44.     }  
  45.   
  46.     if (2*nCount > nLength)  
  47.     {  
  48.         return true;  
  49.     }  
  50.     else  
  51.     {  
  52.         cout << "数组中不存在次数超过一半的数字!" << endl;  
  53.         return false;  
  54.     }  
  55. }  
  56.   
  57.   
  58. int _tmain(int argc, _TCHAR* argv[])  
  59. {  
  60.     int nNum = 0;  
  61.     int nArr1[9] = {1,2,3,2,2,2,5,4,2};  
  62.     if (FindHalfCountNum(nArr1, 9, nNum))  
  63.     {  
  64.         cout << "数组中出现次数超过一半的数字为:" << nNum << endl;  
  65.     }  
  66.   
  67.     int nArr2[9] = {1,2,3,2,8,2,5,4,2};  
  68.     if (FindHalfCountNum(nArr2, 9, nNum))  
  69.     {  
  70.         cout << "数组中出现次数超过一半的数字为:" << nNum << endl;  
  71.     }  
  72.   
  73.     int nArr3[1] = {1};  
  74.     if (FindHalfCountNum(nArr3, 1, nNum))  
  75.     {  
  76.         cout << "数组中出现次数超过一半的数字为:" << nNum << endl;  
  77.     }  
  78.     system("pause");  
  79.     return 0;  
  80. }  
运行结果:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值