面試題38 數字在排序陣列中出現的次數

2021-06-20 03:51:48 字數 1822 閱讀 5075

問題說明:

1.給定排序的陣列,例如從小到大已經排序。

2.給定某個查詢關鍵字,求出該關鍵字出現的次數。

3.完全遍歷一遍,時間複雜度為o(n),並未充分利用排序的資訊。

4.需要借鑑二分查詢的思想改進,演算法的時間複雜度為o(logn)。

package com.zhang.csdn;

/** * @author pizi

* @date 2023年1月7日

*/public class binarysearchtest ;

//int a = ;

//int a = ;

int a = ;

system.out.println(countvalue(a, 19));

} // find the count of keyvalue in sorted array

// not find return - 1

public static int countvalue(int sorted, int keyvalue)

int firstpos = getfirstkey(sorted, 0, len - 1, keyvalue);

int lastpos = getlastkey(sorted, 0, len - 1, keyvalue);

boolean isfound = (firstpos != -1) && (lastpos != -1);

return isfound? (lastpos - firstpos + 1) : -1;

} private static int getlastkey(int sorted, int fromindex, int toindex, int keyvalue)

// fromindex <= toindex

int midindex = (fromindex + toindex) >> 1;

int midvalue = sorted[midindex];

if(midvalue < keyvalue)

if(midvalue > keyvalue)

//midvalue == keyvalue

boolean islast = (midindex == toindex) ||((midindex < toindex) && (sorted[midindex + 1] != keyvalue));

return islast? midindex : getlastkey(sorted, midindex + 1, toindex, keyvalue);

}private static int getfirstkey(int sorted,int fromindex, int toindex, int keyvalue)

// fromindex <= toindex

int midindex = (fromindex + toindex) >> 1;

int midvalue = sorted[midindex];

if(midvalue < keyvalue)

if(midvalue > keyvalue)

// midvalue == keyvalue

boolean isfirst = (midindex == fromindex) || ((midindex > fromindex) && (sorted[midindex - 1] != keyvalue));

return isfirst? midindex : getfirstkey(sorted, fromindex, midindex - 1, keyvalue);

}}

面試題38 數字在排序陣列中出現的次數

統計乙個數字在排序陣列中出現的次數。陣列是排序的,所以重複出現的數字是相鄰排列的。用二分查詢演算法,找到第一次出現的位置,和 最後一次出現的位置。判斷第一次出現的位置條件為 當前數字的前乙個是否與之相等,若是則繼續查詢,否則該位置就是第一次出現的位置。判斷最後一次出現的位置條件為 當前數字的後乙個是...

面試題38 數字在排序陣列中出現的次數

1.統計乙個數字在乙個排序陣列中出現的次數,例如陣列,找出3出現的次數4.分析 最直觀的方法就是從頭到尾的掃瞄一遍陣列,逐個進行比對,統計出現的次數。這樣的時間複雜度是o n 但是考慮到是已經排序的陣列,如果乙個數字在陣列中出現的話,找乙個數字有很多種方法,例如二分查詢的方法,可以在o lgn 的時...

面試題 數字在排序陣列中出現的次數

本體的思路 二分查詢 因為陣列有序 查詢數字 在陣列 中出現的次數 特殊 陣列為空 數字不出現在陣列中 數字出現在頭 尾 數字剛好為中間值 數字不為中間值 先對 返回 再判斷對 如果是首,則令last first,迴圈判斷list last 是否依舊等於a,相等則計數加 不等時,若last是第乙個不...