問題說明:
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是第乙個不...