C 演算法之 陣列中出現次數超過一半的數字

2021-06-27 20:55:32 字數 1534 閱讀 4656

題目描述:陣列中有乙個數字出現的次數超過陣列長度的一半,請找出這個數字。例如輸入乙個長度為9的陣列。由於數字2在陣列中出現了5次,超過陣列長度的一半,因此輸出2。

看到這個題目,我自己想到的方法:

另外申請乙個陣列b,用來存放該陣列a 元素出現的次數,再遍歷b陣列,出現次數最多的就是;但是這個如果a陣列當中的元素有個是1000,那麼b陣列就要申請至少1000,空間浪費太嚴重。

方法二:

類似於消除原理,既然某個數字大於長度的一半,那麼我們就遍歷陣列,如果兩個數不相等則消除,最後剩下的數就是我們要的。當然如果不存在這樣的數,這是不行的。所以最後要再遍歷一遍驗證這個數的出現次數是否大於陣列的一半。

我們在遍歷陣列的時候儲存兩個值,乙個是陣列中的乙個數字,乙個是次數。當我們遍歷到下乙個數字的時候,如果下乙個數字和我們之前儲存的數字相同,則次數加1;如果下乙個數字和我們之前儲存的數字不同,則次數減掉1.如果次數為0,則我們要儲存下乙個數字,並把次數設為1

例如 1 2 3 2 2 2 5 4 2

遍歷 1  值result = 1, 次數count = 1;遍歷2, 1 != 2, count = 1-1=0; 遍歷3 result = 3, conut = 1; ,。。。。。。。依次類推

// morethanhalfnum.cpp : 定義控制台應用程式的入口點。

//#include "stdafx.h"

#include using namespace std;

bool g_inputinvalid = true;

bool checkinvalidarray(int array,int nlength)

return g_inputinvalid;

}bool checkmorethanhalf(int array, int nlength, int result)

} bool ismorethanhalf = true;

if (count * 2 <= nlength)

return ismorethanhalf;

}void findkey(int array, int nlength)

int result = array[0];

int count = 1;

for (int i = 1; i < nlength; ++i)

else

else

}} //判斷陣列是否符合標準,排除輸入的陣列的當中沒有超過陣列一半的情況

if (checkmorethanhalf(array,nlength,result) == 0)

if (result == 0)

{ cout<<"您的陣列當中沒有出現次數超過一半的數字"<

注意要考慮如果不存在大於陣列一半長度的情況!

方法三:

先進行排序,然後排序後中間的那個數字肯定就是我們要找的數字;

但是一般的排序演算法都要 o(n*lgn); 我自己想到的那個方法時間複雜度為o(n),但是空間犧牲太大;

總之兩個方法都不是很好

最好的選擇就是第二種方法!

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

題目 陣列中有乙個數字出現的次數超過陣列長度的一半,請找出這個數字。例如輸入乙個長度為9的陣列。由於數字2在陣列中出現了5次,超過陣列長度的一半,因此輸出2。如果不存在則輸出0.思路一 把陣列排好序,出現次數超過一半的數一定是排好序陣列的中位數。然後取中位數,計算它出現的次數是否超過陣列長度的一半。...

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

何海濤 劍指offer 名企面試官精講典型程式設計題 九度oj 題目描述 陣列中有乙個數字出現的次數超過陣列長度的一半,請找出這個數字。例如輸入乙個長度為9的陣列。由於數字2在陣列中出現了5次,超過陣列長度的一半,因此輸出2。輸入 每個測試案例包括2行 第一行輸入乙個整數n 1 n 100000 表...

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

陣列中出現次數超過一半的數字 陣列中有乙個數字出現的次數超過陣列長度的一半,請找出這個數字。例如輸入乙個長度為9的陣列。由於數字2在陣列中出現了5次,超過陣列長度的一半,因此輸出2。如果不存在則輸出0。class solution count 0 for auto i numbers if i k ...