zoukankan      html  css  js  c++  java
  • 剑指Offer解题报告(Java版)——排序数组中某个数的个数 38

       

    分析问题

       

    问题只需要找到排序数组中某个数K的个数,由于已经是排序了,K一定是在一堆的,所以我们只需要找到第一个Kindex1,然后找到最后一个Kindex2就可以了

       

    而寻找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;

    }

  • 相关阅读:
    输入属性,输出属性
    angular响应式表单
    angular 响应式表单指令
    c++ Primer
    CString 操作函数
    字符串分割strtok_s
    LPSTR LPTSTR
    CString分割切分
    CStringArray
    十进制
  • 原文地址:https://www.cnblogs.com/keedor/p/4475413.html
Copyright © 2011-2022 走看看