例如輸入陣列中查詢3出現的次數。
最為簡單的方法就是從頭遍歷這個陣列,統計3出現的次數,可是這樣沒有利用這是乙個排序了的陣列這個條件,時間複雜度o(n)。
另一種方法就是利用二分查詢的演算法找到乙個3,然後分別向左和向右查詢第乙個和最後乙個3所在的位置,這樣雖然比第一種方法效率提高了,但是當最壞的情況時,即陣列中所有的元素都是3時,這樣時間複雜度依然為o(0.5n) == o(n)。
因此有必要繼續提高效率。
我們先來找第乙個k的位置,由於
二分查詢演算法總是拿陣列中間的數字和k比較。
如果數字比k大,那麼k只可能出現在陣列的前半段;
如果中間數字比k小,那麼k只可能出現在陣列的後半段;
如果中間數字和k相等呢?怎麼判斷這個數字是不是第乙個k:如果中間數字的前乙個數字不是k,那麼中間這個數字就是第乙個k,否則第乙個k一定出現在陣列的前半段。
找最後乙個k的位置思想也是一樣的。
int getfirstk(int* array, int length, int k, int start, int end)
else if( k < middledata )
end = middleindex - 1;
else
start = middleindex + 1;
return getfirstk( array, length, k, start, end );
}int getlastk(int* array, int length, int k, int start, int end)
else if( k < middledata )
end = middleindex - 1;
else
start = middleindex + 1;
return getlastk( array, length, k, start, end);
}int getnumberofk(int* array, int length, int k)
return number;
}
面試題38 數字在排序陣列中出現的次數
問題說明 1.給定排序的陣列,例如從小到大已經排序。2.給定某個查詢關鍵字,求出該關鍵字出現的次數。3.完全遍歷一遍,時間複雜度為o n 並未充分利用排序的資訊。4.需要借鑑二分查詢的思想改進,演算法的時間複雜度為o logn package com.zhang.csdn author pizi d...
面試題38 數字在排序陣列中出現的次數
統計乙個數字在排序陣列中出現的次數。陣列是排序的,所以重複出現的數字是相鄰排列的。用二分查詢演算法,找到第一次出現的位置,和 最後一次出現的位置。判斷第一次出現的位置條件為 當前數字的前乙個是否與之相等,若是則繼續查詢,否則該位置就是第一次出現的位置。判斷最後一次出現的位置條件為 當前數字的後乙個是...
面試題38 數字在排序陣列中出現的次數
1.統計乙個數字在乙個排序陣列中出現的次數,例如陣列,找出3出現的次數4.分析 最直觀的方法就是從頭到尾的掃瞄一遍陣列,逐個進行比對,統計出現的次數。這樣的時間複雜度是o n 但是考慮到是已經排序的陣列,如果乙個數字在陣列中出現的話,找乙個數字有很多種方法,例如二分查詢的方法,可以在o lgn 的時...