不錯的題。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 表...