乙個陣列中有乙個數字的次數超過了陣列的一半

2021-08-04 04:42:54 字數 1250 閱讀 5802

問題描述

乙個陣列中有乙個數字的次數超過了陣列的一半,求出這個字元。如:int a=,求出超過一半的數字是2。

問題分析

方法1、時間複雜度o(n)

思路: 如果乙個數出現的次數超過陣列一半的長度,那麼就是說出現的次數比其他所有數字出現的次數還要多。因此我們可以考慮儲存2個值,乙個是陣列中的乙個數,乙個是數的次數。當我們遍歷到下乙個數字的時候,如果下乙個數字和我們之前儲存的數字相同,則次數加1,如果不同則次數減1。如果次數為0了這儲存當前遍歷到的數,並把次數設為1。由於找的數字出現的次數比其他的所有的數字出現的次數之和都要大,那麼要找的數字肯定是最後把次數設為1時所對應的數字。

注:要注意檢查輸入引數是否合法,以及結果是否正確,可能陣列中沒有超過一半的數字

int morethanhalfnum(int *arr,int len)

else

if (arr[i] == result)

++count;

else

--count;

}//檢測結果是否正確

return result;

}

方法2、

思路:

陣列中有乙個數字出現的次數超過了陣列長度的一半,如果把陣列排序,那麼排序之後的位於陣列中間的數字一定是就是那個出現次數超過陣列長度一半的數字。

即:排序之後,取陣列中間的數字。

int morethanhalfnum2(int *arr,int

len)

還有一種方法,基於快速排序,

在陣列中隨機選擇乙個數字,然後調整陣列中數字的順序,大於選中數字放在右邊,小於選中的數字放在左邊,如果選中的數字的下標正好是n/2,那麼該數字就是該陣列的中位數,如果大於n/2,那麼中位數在它的左邊,如果小於n/2,那麼在右邊查詢。

方法3、

思路:可以用雜湊表儲存陣列中數字出現的次數,然後遍歷雜湊表,找出出現次數一半的數字。

int findsingle2(int a, int len)//hashmap 統計  

else

} it = imap.begin();

while(it!=imap.end())

return -1;

}

找出乙個陣列中各個數字出現的次數

看了prime第一章,突發奇想了乙個問題,如何寫乙個演算法去找出乙個陣列中各個數字出現的次數呢?方法一 可以使用我們經常寫的演算法,氣泡排序之類的,首先對陣列進行排序,然後根據prime中第一章的寫法。算出每個數字出現的次數。include include using namespace std i...

將乙個陣列追加到別乙個陣列

問題 將乙個陣列追加到別乙個陣列 方案 1 使用array merge 在使用這個合併陣列時如果使用數字鍵,那麼索引會重新編號.如果使用字串鍵,則會導致第二個陣列中的鍵 覆蓋第乙個陣列中的同名鍵 此時第乙個陣列中的值也就消失了 如果是兩種鍵則會表現出上述兩種特徵.r array 1 2 dd 3 4...

php 清空乙個陣列 php如何刪除乙個陣列

php如何刪除乙個陣列2020 07 10 01 16 35 php刪除乙個陣列的方法 1 使用unset函式刪除乙個陣列元素,且保持原有索引不變 2 使用 array splice 函式刪除乙個陣列元素,不保持索引 3 使用 array diff 函式,按值刪除多個元素,保持索引。php刪除陣列 ...