1、題目描述
陣列中有乙個數字出現的次數超過陣列長度的一半,請找出這個數字。例如輸入乙個長度為9的陣列。由於數字2在陣列中出現了5次,超過陣列長度的一半,因此輸出2。如果不存在則輸出0。
2、**1:
2.1思路:如果乙個數字在陣列中出現的次數多於一半,那麼這數字一定是整個陣列數字的中位數。因為核心點在於如何求陣列的中位數。求中位數,最快的就是快快速排序演算法。因此這個思路中,核心點就是實現快速排序演算法。
2.2**:
#include
#include
#include
using
namespace
std;
//劍指offer書上o(n)複雜度
//交換vector的兩個數
void swap(vector
& numbers, int i, int j)
//得到乙個範圍內的隨機數
int getranddata(int start, int end)
//快排程式 -- end是可以取到的最後的下標
int partition(vector
& numbers, int start, int end)
}//交換回index的位置
++small;
swap(numbers, end,small);
return small; //返回當前選取的隨機數的新的下標
}//找出中位數
int findmiddledata(vector
numbers)
return numbers[index];
}class solution
};int main()
; vector
vec;
for(int i=0;i<9;i++)
vec.push_back(data[i]);
solution a;
cout
<< a.morethanhalfnum_solution(vec) <"pause");
return
1;}
3.3注意的幾點:
(1)快速排序演算法的實現很關鍵,重點,無論什麼時候快速排序都需要能夠很快寫出來。
(2)隨機選擇函式中,srand種子初始化的時候注意,一般srand種子初始化只需要執行一次,不能多次。如果每次取隨機數的時候都執行一次種子初始化,可能多次取的隨機數都是一樣的。典型情況如下:
//得到乙個範圍內的隨機數
int getranddata(int start, int
end)
這裡每次取隨機數都用系統時間做種子初始化,由於函式執行快,那麼可能聯絡呼叫getranddata函式的時候,time函式的返回的系統時間相同,每次都重新設定了種子,且是相同的種子,因此,得出的隨機數是一樣的。
3、**2
3.1思路:遍歷陣列所有的資料,用乙個資料儲存乙個陣列中的值,乙個用於儲存次數。每次遍歷下乙個資料的時候,和當前儲存的陣列中的值進行比較,相同則次數加1,不同則次數減1。第乙個數字的時候,次數為1。當遍歷中遇到次數為0的時候,把當前遍歷的陣列的值設定成儲存的值,次數設定成1。那麼最後出現次數最多的數字一定是最後的那個資料儲存的值。但是最後儲存的值不一定是出現此處最多的數字。基本思想:陣列中出現次數大於一半的數字出現的次數一定比其餘所有數字出現的次數總和還要大
3.2**:
#include
#include
using
namespace
std;
class solution
if(numbers[i]==data)
times++;
else
times--;
}//檢測data是不是出現次數最多的那個數
times=0;
for(int i=0;iif(data==numbers[i])
times++;
if(times<=(numbers.size()/2))
data=0;
return data;
}};int main()
; vector
vec;
for(int i=0;i<9;i++)
vec.push_back(data[i]);
solution a;
cout
<< a.morethanhalfnum_solution(vec) <"pause");
return
1;}
陣列中出現次數超過一半的數字
何海濤 劍指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 ...
陣列中出現次數超過一半的數字
題目描述 陣列中有乙個數字出現的次數超過陣列長度的一半,請找出這個數字。例如輸入乙個長度為9的陣列。由於數字2在陣列中出現了5次,超過陣列長度的一半,因此輸出2。如果不存在則輸出0。解題思路 將陣列按大小排序,若存在數字出現次數超過陣列長度的一般,則陣列中位數必定為該數字 1 將陣列排序完成後,取a...