剑指offer_数字在排序数组中出现的次数

来源:互联网 发布:eddie griffin 知乎 编辑:程序博客网 时间:2024/06/08 11:34

题目描述

统计一个数字在排序数组中出现的次数。

解题思路

  1. 排序数组中查找,利用二分查找
  2. 改进二分查找,计算k值起始位和结束位
    • lastK - firstK + 1

Java实现

public class Solution {    public int GetNumberOfK(int [] array , int k) {        int length = array.length;        if (length == 0)            return 0;        int firstK = getFirstK(array, k, 0, length-1);        int lastK = getLastK(array, k, 0, length-1);                if (firstK > -1 && lastK > -1)            return lastK - firstK + 1;        return 0;    }    private int getFirstK(int[] array, int k, int start, int end){        int length = array.length;        int mid = start + (end - start) >> 1;        while(start <= end){            if(array[mid] > k){                end = mid - 1;            }else if(array[mid] < k){                start = mid + 1;            }else if(mid-1 >= 0 && array[mid-1] == k){                end = mid - 1;            }else{                return mid;            }            mid = start + ((end - start) >> 1);        }        return -1;    }    private int getLastK(int[] array, int k, int start, int end){        int length = array.length;        int mid = start + (end - start) >> 1;        while(start <= end){            if(array[mid] > k){                end = mid - 1;            }else if(array[mid] < k){                start = mid + 1;            }else if(mid+1 <= end && array[mid+1] == k){                //二分查找改进地方                start = mid + 1;            }else{                return mid;            }            //更新mid,计算mid要使用如下方法            mid = start + ((end - start) >> 1);        }        return -1;    }}
阅读全文
0 0
原创粉丝点击