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

2021-06-12 17:55:28 字數 1257 閱讀 5604

分析:

最直接的方法,對陣列中所有的數排序,然後再掃瞄一遍,統計各個數出現的次數。如果某個數出現的次數超過一半,則輸出這個數。演算法的時間複雜度是o(n * log

2n + n)。

如果每次刪除兩個不同的數,那麼,在剩下的數字裡,超過一半的數的個數一樣超過了50%。不斷重複這個過程,最後剩下的即

為所求。無需避免的排序,時間複雜度只為o(n)。

方法:

使用兩個變數a和b,其中a儲存某個陣列中的數,b用來計數。開始時將b初始化為0。遍歷陣列,如果b=0,則令a等於當前數,令b等於1;如果當前數與a相同,則b=b+1;如果當前數與a不同,則令b=b-1。遍歷結束時,a中的數就是要找的數。 

這個演算法的時間複雜度是o(n),空間複雜度為o(1)。

type find(type* id, int n)

else

}return candidate;

}

擴充套件:隨著tango的發展,管理員發現,「超級水王」沒有了。統計結果表明,有3個發帖很多的id,他們的發帖數目都超過了帖子總數目n的1/4。你能從發帖id列表中快速找出他們的id嗎?

求解內容極其相似,相同的思路進行求解即可。同時刪除4個不同的id後,剩餘資料中3個多數id仍然是多數id。

上題只需要乙個結果,而現在需要3個結果,上題用到的ntimes,也應改為3個計數器。現在我們需要3個變數來記錄當前遍歷過的3個不同的id,而ntimes的3個元素分別對應當前遍歷過的3個id出現的個數。如果遍歷中有某個id不同於這3個當前id,我們就判斷當前3個id是否有某個的ntimes為0,如果有,那這個新遍歷的id就取而代之,並賦1為它的遍歷數(即ntimes減1),如果當前3個id的ntimes皆不為0,則3個id的ntimes皆減去1。

#include using namespace std;

int candidate[3];

int count[3] = ;

int input[100];

int num = 0;

int main()

bool flag = false;

for (int i = 0;i < num;i++)

if (candidate[j] == input[i])

}if (flag == true)

for (int j = 0;j < 3;j++)

}if (flag == true)

for (int j = 0;j < 3;j++)

}cout<

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

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

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

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

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

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