題目描述:陣列中有乙個數字出現的次數超過陣列長度的一半,請找出這個數字。例如輸入乙個長度為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 ...