題目:在一個整型數組中有一個元素的出現次數超過了數組長度的一半,試設計一個 在時間上盡可能高效的算法,找出這個元素。要求:
(1)給出算法的基本設計思想。
(2)根據設計思想,采用C或C++或Java語言描述算法,關鍵之處給出注釋。
(3)說明你所設計算法的時間復雜度和空間復雜度。
(1)基本的設計思想:
一個數字出現的次數超過了長度的一半, 那么我們可以這樣認為這個數字出現的個數一定大於其他全部數字出現的個數之和。算法的步驟如下:
①設數組為data[],數組長度為n,i=1。置currentAxis=data[0],currentNum=1。
②當data[i]==currentAxis時,currentNum++,轉向④;否則轉向③。
③currentNum--,當currentNum==0時,currentAxis=data[i]。
④當i==data.length時, 轉向⑤;否則,i++,轉向②;
⑤返回currentAxis。
(2)算法實現:
#include<iostream> using namespace std; int funtion(int data[],int length) { int currentAxis; //假設要求的元素的位置 int currentNum = 0; //要求元素的個數變量 for(int i =0;i<length;i++) { if(currentNum ==0){ //如果要求的元素還沒出現,設置要求的元素為現在要比較的元素 currentAxis=data[i]; currentNum=1; } else { if(currentAxis==data[i]) //假設的結果與比較元素不同,假設結果個數增1,否則減1 currentNum++; else currentNum--; } } return currentAxis; //返回最終結果的位置。 } int main() { int arr[]={1,2,3,2,5,6,2,2,3,2,2,4}; cout<<"number="<<funtion(arr,12)<<endl; return 0; }
(3)時間復雜度為O(n)。空間復雜度O(1)。
【另解】本題最直接的方法就是對每個數字進行排序。然后輸出出現次數最大的數字即可,但排序的時間復雜度最快也要O(nlog2n)。
