日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

找出数组中出现次数超过一半的数

發(fā)布時間:2025/6/15 编程问答 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 找出数组中出现次数超过一半的数 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

算法--找出數(shù)組中出現(xiàn)次數(shù)超過一半的數(shù)
???? 每當(dāng)我看到經(jīng)典的算法題,就懷念高中,感覺很多算法題就是高中的題目,誰叫哥只讀了個專科,高數(shù)基本相當(dāng)沒學(xué)。
???? 有空要看看高數(shù)啊,想當(dāng)年數(shù)學(xué)那是相當(dāng)?shù)?.....


#include <iostream>
using namespace std;
class FindTheOne
{
public:
??方法一
? 第一個想到的方法是見一個二維數(shù)組,一維存數(shù)組中的數(shù)據(jù),二維存這個數(shù)出現(xiàn)的次數(shù)。出現(xiàn)次數(shù)最多的那個數(shù)就是要找的那個數(shù)
? 由于某個數(shù)出現(xiàn)的次數(shù)超過數(shù)組長度的一半,所以二維數(shù)組的長度只需要這個數(shù)組的一半。代碼實現(xiàn)如下,
? 當(dāng)然這個方法很糟糕,時間復(fù)雜度和空間復(fù)雜度都比較大,想練手的我還是寫了一下。

  

void?Search(int?A[],int?len,int&?theOne)
{
if(NULL==A?||?len<=0)
{
return?;
}

int?(*B)[2]=newint[len/2][2];
B[
0][0]=A[0];
B[
0][1]=1;

int?t=0;
bool?notExist=true;
for(int?i=1;i<len;++i)
{
for(int?j=0;j<t;++j)
{
if(A[i]==B[j][0])
{
B[j][
1]++;
notExist
=false;
break;
}
}
if(notExist)
{
B[t
++][0]=A[i];
}
}

int?max=1;
int?k=0;
for(int?i=0;i<len/2;++i)
{
if(B[i][1]>max)
{
max
=B[i][1];
k
=i;
}
}

theOne
=B[k][0];
}

方法二
???? 將數(shù)組排序,最中間的那個數(shù)就是您要找的數(shù)。
?? ? 如果出現(xiàn)最多的那個數(shù)是最小的,那么1至(n+1)/2都是那個數(shù)
???? 如果出現(xiàn)最多的那個數(shù)是最大的,那么(n-1)/2至n都是那個數(shù)
???? 如果不是最小也不是最大,當(dāng)這個數(shù)由最小慢慢變成最大的最大的數(shù)時,你會發(fā)現(xiàn)中間的那個數(shù)的值是不變的。
???? 綜上所述,中間的那個數(shù)就是你要找的那個數(shù)。
???? 時間復(fù)雜度就是你排序用的時間。排序真的不想寫了(可以參考《我的另一篇博客》)。大家都知道排序還是相當(dāng)費時的,當(dāng)然這個方法還是不太好。

?方法三
???? 這個方法借用了別人的思路。
???? 在這里我做一下簡單的分析。
???? 這個算法的時間復(fù)雜度是O(n),另外用了兩個輔助變量。
???? k用于臨時存儲數(shù)組中的數(shù)據(jù),j用于存儲某個數(shù)出現(xiàn)的次數(shù)。
???? 開始時k存儲數(shù)組中的第一個數(shù),j為0,如果數(shù)組出現(xiàn)的數(shù)于k相等,則j加1,否則就減1,如果j為0,就把當(dāng)前數(shù)組中的數(shù)賦給k
???? 因為指定的數(shù)出現(xiàn)的次數(shù)大于數(shù)組長度的一半,所有j++與j--相抵消之后,最后j的值是大于等于1的,k中存的那個數(shù)就是出現(xiàn)最多的那個數(shù)。

??? 下面這個算法只適合數(shù)組中數(shù)組中某個數(shù)的出現(xiàn)次數(shù)超過數(shù)組長度一半的數(shù)組,符合題意。

int?Search(int?A[],int?len)
{
if(NULL==A?||?len<=0)
{
return-1;
}

int?k, j=0;
for(int?i=0;i<len;++i)
{
if(j==0)
{
k
=A[i];
}
if(k==A[i])
{
++j;//有人說++j比j++有先天的優(yōu)勢,不知你是否聽說,如果你也聽說,有沒有想過More Effective C++(C++程序員必看書籍)
}else
{
--j;
}
}

return?k;
}

總結(jié)

以上是生活随笔為你收集整理的找出数组中出现次数超过一半的数的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。