java 数组中某个数出现的概率_剑指Offer解题报告(Java版)——排序数组中某个数的个数 38...
分析問題
問題只需要找到排序數組中某個數K的個數,由于已經是排序了,K一定是在一堆的,所以我們只需要找到第一個K的index1,然后找到最后一個K的index2就可以了
而尋找K的過程我們一般通過二分法查找,這樣時間復雜度能降到logn
解決問題
我們通過二分法尋找k,如果中間的數小于k,那么在前半段找k;如果中間的數大于k,那么在后半段找k,那么如何判斷找到的k是否是一堆k的邊界呢
找第一個k的時候判斷方式如下:
如果中間的數等于k,那么先判斷前一個數是否存在,如果存在且等于k,在前半段找
如果存在不等于k或者不存在,那么這個數就是第一個k
找最后一個k的時候判斷方式如下:
如果中間的數等于k,那么先判斷后一個數是否存在,如果存在且等于k,在后半段找,如果存在不等于k或者不存在,那么這個數就是最后一個k
主要代碼
int getLastK(int[] data,int length,int k,int start,int end){
if (start>end) {
return -1;
}
int midIndex=(start+end)/2;
int midData=data[midIndex];
if (data[midIndex]==k) {
if( (midIndex
return midIndex;
}else {
start=midIndex+1;
}
}else if (midData
start=midIndex+1;
}else {
end=midIndex-1;
}
return getLastK(data,length,k,start,end);
}
int getFirstK(int[] data,int length,int k,int start,int end){
if (start>end) {
return -1;
}
int midIndex=(start+end)/2;
int midData=data[midIndex];
if (data[midIndex]==k) {
if( (midIndex>0&&data[midIndex-1]!=k)||midIndex==0) {
return midIndex;
}else {
end=midIndex-1;
}
}else if (midData>k) {
end=midIndex-1;
}else {
start=midIndex+1;
}
return getFirstK(data,length,k,start,end);
}
int getNumOfK(int[] data,int length,int k){
int result = 0;
if (data!=null&&length>0) {
int first=getFirstK(data, length, k, 0, length-1);
int last=getLastK(data, length, k, 0, length-1);
System.out.println(first);
System.out.println(last);
if (first>-1&&last>-1) {
result=last-first+1;
}
}
return result;
}
總結
以上是生活随笔為你收集整理的java 数组中某个数出现的概率_剑指Offer解题报告(Java版)——排序数组中某个数的个数 38...的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 利用cronolog来做log转换(邦戈
- 下一篇: JAVA程序设计计时器代码_Java中的