題目:統計乙個數字
k在排序陣列中出現的次數。
思路:已知陣列是排好序的,對於乙個有序的陣列,方法
1:要判斷乙個數字
k在陣列中出現的次數乙個直接的方法是順序遍歷,記錄
k的出現次數,時間複雜度為
o(n)
,顯然不是最優;方法
2:也可以使用二分法先找到這個
k值,時間複雜度是
o(logn)
,但是這時找到的
k可能是多個
k中的其中乙個,不知道
k的開始位置和結束位置再**,需要從
k開始向左和向右遍歷找出第乙個
k和最後乙個
k,這也是遍歷,在最壞情況下當整個陣列全部都是
k值時,時間複雜度為
o(n)
,就算不是最壞情況,也需要遍歷部分陣列,因此時間複雜度也是
o(n)
級別的。顯然也不是最優。方法
3:使用改進後的二分法找出第乙個
k和最後乙個
k。二分法的作用是在排序的陣列中找出指定的乙個數,通過不斷與中間值比較、對半分割將查詢範圍縮小一半從而保證時間複雜的為
o(logn)
,過去的二分法中,得到
a[middle]
值之後,將k與
a[middle]
進行比較,如果
k< a[middle]
則在左邊,更換邊界條件繼續查詢;如果
k> a[middle]
則在右邊,更換查詢邊界繼續查詢;如果
k== a[middle]
則表示找到,直接結束;現在,當
k== a[middle]
時還不能結束,要判斷
a[middle-1]
是否等於
k,如果不等,表示這個
k值是第乙個
k,記錄這個下標作為
firstk=middle
;否則說明這個
k不是第乙個
k,第乙個
k還在前面的部分中,於是調整查詢邊界條件,繼續使用二分法進行查詢;使用相同的方法可以找到
lastk
;這裡可是使用
while
迴圈或者遞迴來實現(而且是為遞迴,很簡單),結束迴圈呼叫的邊界條件是找到
firstk
而return或者都邊界了還是找不到(這裡又兩種處理方法對應不同的邊界,如果每次二分判斷時,當
k>middle
時,令新的
left=middle+1
,當k時令
right=middle-1
,此時迴圈中止的條件是
right,即要當兩個指標錯位時才表示迴圈結束;如果當
k>middle
時,令新的
left=middle
,當k時令
right=middle
,那麼迴圈終止條件是
right-left<=1
;過去我使用第二種,現在統一改為第一種)
特殊的,注意:在二分法每次判斷後調整查詢邊界時,
left=middle+1;
right=middle-1;
不會導致陣列越界;但是本題中,附加的判斷
array[middle-1]!=k
;array[middle+1]!=k
中middle-1
和middle+1
可能導致陣列越界,因此必須修復,當
middle-1
和middle+1
越界時,說明當前
middle
是陣列的第乙個或者最後乙個元素,那麼顯然是重複數字
k的第乙個
k和最後乙個
k,直接返回
middle
作為下標即可。
//改進二分法的判斷條件,使得找到第乙個或者最後乙個k時才停止二分尋找,保證整體的複雜度為o(logn)
public class solution
//該方法用來遞迴查詢第乙個k,如果沒有k則返回-1
public int getfirstkindex(int array , int left, int right, int k) else
return getfirstkindex(array,left,right,k);
}//該方法用來遞迴查詢最後乙個k,如果沒有k則返回-1
public int getlastkindex(int array , int left, int right, int k) else
return getlastkindex(array,left,right,k);
}}
數字在排序陣列中出現次數
統計乙個數字在排序陣列中出現的次數。思路 求乙個數字在這個排序陣列中出現的次數,首先想到的是使用二分查詢,當我找到乙個位置,然後往前就可以到達最前面第乙個出現該數字的位置,往後就可以到達最後面最後乙個出現該數字的位置,然後兩個位置相減此時就得到該數字出現的次數。但是問題在於我用二分查詢到位置後,然後...
數字在排序陣列中出現的次數
何海濤 劍指offer 名企面試官精講典型程式設計題 九度oj 題目描述 統計乙個數字在排序陣列中出現的次數。輸入 每個測試案例包括兩行 第一行有1個整數n,表示陣列的大小。1 n 10 6。第二行有n個整數,表示陣列元素,每個元素均為int。第三行有1個整數m,表示接下來有m次查詢。1 m 10 ...
數字在排序陣列中出現的次數
題目 統計乙個數字下排序陣列中出現的次數。例如輸入排序陣列和數字3,由於3在這個陣列中出現了4次,因此輸出4。當然第一眼就能想到遍歷這個陣列然後統計這個陣列中某個數字出現的次數。當然第一眼就能想到的方法通常來說效率都不怎麼樣 再稍微想一下這個題目,是乙個已序的陣列,所以呢,不難想到二分查詢。我們可以...