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

2021-07-05 02:11:00 字數 1204 閱讀 2963

不錯的題。o(n+k*log(n))過不了,o(n)可以過,有些人直接快排過了,這個似乎有點不太好

這道題兩種思路:

(1)o(n+k*log(n))   我的超時了,即使遞迴改為非遞迴也超時

思路:如果乙個數出現次數超過總個數的一半,那麼這個數的數值必然等於中位數的數值,因為如果排序的話,那麼這個數必然會「包住」中數。下面是**,注釋掉的是遞迴版

#include #include #include #include #include using namespace std;

const int size = 100000+1;

int num[size];

int n;

int partition(int num, int st, int en)

num[st] = pivort;

return st;

}/*int findmid(int num, int st, int en, int p)

if(pos > p)

if(pos < p)

}}*/int flag;

int findmid(int num, int st, int en, int p)

if(pos > p)

if(pos < p)

}flag=0;

return num[0];

}int main()

if(cnt*2 > n)

printf("%d\n",c);

else

printf("-1\n");

}return 0;

}

(2)正確思路o(n)  要求的數出現的次數比其他數出現的次數的總和還多。

有乙個很好的性質,如果當前還沒有找到乙個數,比遇到的其他數出現的次數總和還多,那麼後面肯定有。額,說的混亂了,看**:

#include #include #include #include #include using namespace std;

const int size = 100000+1;

int num[size];

int n;

bool check(int c)

return false;

}int solve(){

int c = num[0];

int cnt =1;

for(int i=1;i

九度 題目1370 陣列中出現次數超過一半的數字

時間限制 1 秒 記憶體限制 32 兆 特殊判題 否 提交 2022 解決 616 題目描述 陣列中有乙個數字出現的次數超過陣列長度的一半,請找出這個數字。例如輸入乙個長度為9的陣列。由於數字2在陣列中出現了5次,超過陣列長度的一半,因此輸出2。輸入 每個測試案例包括2行 第一行輸入乙個整數n 1 ...

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

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

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

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