剑指Offer解题报告(Java版)——排序数组中某个数的个数 38
2015-05-04 09:38
405 查看
分析问题
问题只需要找到排序数组中某个数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<length-1&&data[midIndex+1]!=k)||midIndex==length-1) {
return midIndex;
}else {
start=midIndex+1;
}
}else if (midData<k) {
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;
}
相关文章推荐
- 剑指Offer面试题38(Java版):数字在排序数组中出现的次数
- 剑指Offer面试题38:数字在排序数组中出现的次数 Java实现
- 剑指offer解题报告(Java版)——二叉树的深度 判断二叉树是否平衡 38
- 剑指Offer面试题38(Java版):数字在排序数组中出现的次数
- 【剑指offer-Java版】38数字在排序数组中出现的次数
- 【剑指offer-解题系列(38)】数字在排序数组中出现的次数
- 剑指offer解题报告(Java版)——数组中只出现一次的数字 40
- 剑指offer——面试题38:数字在排序数组中出现的次数
- 剑指Offer:面试题38 数字在排序数组中出现的次数
- [剑指offer][面试题38]数字在排序数组中出现的次数
- 【剑指offer】面试题38-数字在排序数组中出现的次数
- 剑指offer 38 数字在排序数组中出现的次数
- 剑指offer--面试题38:数字在排序数组中出现的次数
- 【剑指Offer学习】【面试题38:数字在排序数组中出现的次数】
- 【剑指Offer】调整数组顺序使奇数位于偶数前面 解题报告(Python)
- 【剑指Offer】重建二叉树 解题报告(Java & Python)
- 剑指offer面试题38:数字在排序数组中出现的次数
- 剑指Offer 38 数字在排序数组中出现的次数
- 剑指Offer解题报告(Java版)——扑克牌顺子 44
- 剑指offer之面试题38数字在排序数组中出现的次数