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;

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值