經典演算法學習 陣列中出現次數超過一半的數字

2021-07-16 06:34:14 字數 1251 閱讀 5995

首先這道演算法題並不是很難,看過劍指offer的同學都知道這是裡面的一道題。在各大公司的面試中也是經常被用到的,今天我們就採用最常規的方法來實現一下。

首先有人會想到,如果能把陣列排序後,那麼中間的那個數字就是超過一半的那個數字了(如果存在的話)。當然排序較快的複雜度為o(nlogn).這種方法完全可以實現,但未必是最好的。

因此,面試中最常規的解法就是使用快速排序中的partition劃分函式來解決該問題。如果有對快速排序不了解的,可以參考這篇部落格  。每進行一次partition函式劃分後,就會把某乙個基準數放到它正確的index上,前面的都小於這個基準數,後面的都大於這個基準數。如果恰好某一次partition後,這個index在陣列的中間位置,那麼這個位置的數字就是超過陣列一半的數字。快速排序也是基於這種思路來進行排序的。所以我們需要做的就是遞迴的呼叫partition,直到找到index == mid位置。**上傳至   。

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

// 使用partition劃分

#include #include void morethanhalf(int *arr, int start, int end);

int partition(int *arr, int start, int end);

void checknumber(int *arr, int length, int num);

int main(int argc, const char * argv)

; morethanhalf(array, 0 ,8);

return 0;

}// 核心**

void morethanhalf(int *arr, int start, int end)

else

}if (index == mid)

}int partition(int *arr, int start, int end)

if (i < j)

while (i < j && arr[i] < x)

if (i < j)

}arr[i] = x;

return i;

}// 檢查該數是否真的是超過一半的,也就是為了驗證原先輸入的陣列中是否真的存在某個數超過陣列長度一半

void checknumber(int *arr, int length, int num)

}if (count > length / 2)

else

return ;

}

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

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

演算法 找出陣列中出現次數超過一半的數

演算法 找出陣列中出現次數超過一半的數 每當我看到經典的演算法題,就懷念高中,感覺很多演算法題就是高中的題目,誰叫哥唯讀了個專科,高數基本相當沒學。有空要看看高數啊,想當年數學那是相當的.方法一 第乙個想到的方法是見乙個二維陣列,一維存陣列中的資料,二維存這個數出現的次數。出現次數最多的那個數就是要...

演算法 找出陣列中出現次數超過一半的數

演算法 找出陣列中出現次數超過一半的數 每當我看到經典的演算法題,就懷念高中,感覺很多演算法題就是高中的題目,誰叫哥唯讀了個專科,高數基本相當沒學。有空要看看高數啊,想當年數學那是相當的.include using namespace std class findtheone int b 2 new...