演算法 找出陣列中出現次數超過一半的數

2021-05-26 11:53:10 字數 1212 閱讀 5846

演算法--找出陣列中出現次數超過一半的數

每當我看到經典的演算法題,就懷念高中,感覺很多演算法題就是高中的題目,誰叫哥唯讀了個專科,高數基本相當沒學。

有空要看看高數啊,想當年數學那是相當的......

方法一

第乙個想到的方法是見乙個二維陣列,一維存陣列中的資料,二維存這個數出現的次數。出現次數最多的那個數就是要找的那個數

由於某個數出現的次數超過陣列長度的一半,所以二維陣列的長度只需要這個陣列的一半。**實現如下,

當然這個方法很糟糕,時間複雜度和空間複雜度都比較大,想練手的我還是寫了一下。

void search(int a,int len,int& theone)

int (*b)[2]=new int[len/2][2];

b[0][0]=a[0];

b[0][1]=1;

int t=0;

bool notexist=true;

for(int i=1;imax)

}theone=b[k][0];

}

方法二

將陣列排序,最中間的那個數就是您要找的數。

如果出現最多的那個數是最小的,那麼1至(n+1)/2都是那個數

如果出現最多的那個數是最大的,那麼(n-1)/2至n都是那個數

如果不是最小也不是最大,當這個數由最小慢慢變成最大的最大的數時,你會發現中間的那個數的值是不變的。

綜上所述,中間的那個數就是你要找的那個數。

時間複雜度就是你排序用的時間。排序真的不想寫了(可以參考《我的另一篇部落格》)。大家都知道排序還是相當費時的,當然這個方法還是不太好。

方法三這個方法借用了別人的思路。

在這裡我做一下簡單的分析。

這個演算法的時間複雜度是o(n),另外用了兩個輔助變數。

k用於臨時儲存陣列中的資料,j用於儲存某個數出現的次數。

開始時k儲存陣列中的第乙個數,j為0,如果陣列出現的數於k相等,則j加1,否則就減1,如果j為0,就把當前陣列中的數賦給k

因為指定的數出現的次數大於陣列長度的一半,所有j++與j--相抵消之後,最後j的值是大於等於1的,k中存的那個數就是出現最多的那個數。

下面這個演算法只適合陣列中陣列中某個數的出現次數超過陣列長度一半的陣列,符合題意。

int search(int a,int len)

int k, j=0;

for(int i=0;i

演算法 找出陣列中出現次數超過一半的數

演算法 找出陣列中出現次數超過一半的數 每當我看到經典的演算法題,就懷念高中,感覺很多演算法題就是高中的題目,誰叫哥唯讀了個專科,高數基本相當沒學。有空要看看高數啊,想當年數學那是相當的.include using namespace std class findtheone int b 2 new...

演算法 找出陣列中出現次數超過一半的數

演算法 找出陣列中出現次數超過一半的數 每當我看到經典的演算法題,就懷念高中,感覺很多演算法題就是高中的題目,誰叫哥唯讀了個專科,高數基本相當沒學。有空要看看高數啊,想當年數學那是相當的.方法一 第乙個想到的方法是見乙個二維陣列,一維存陣列中的資料,二維存這個數出現的次數。出現次數最多的那個數就是要...

演算法 找出陣列中出現次數超過一半的數

演算法 找出陣列 現次數超過一半的數 每當我看到經典的演算法題,就懷念高中,感覺很多演算法題就是高中的題目,誰叫哥唯讀了個專科,高數基本相當沒學。有空要看看高數啊,想當年數學那是相當的.include using namespace std class findtheone int b 2 new ...