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

数字在排序数组中出现的次数

题目描述

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

思路

  1. 处理已排好序的数组,考虑用二分查找的思想
  2. 用二分查找找到这个数出现的第一个位置,再找到出现的最后一个位置,可得这个数出现几次,这样的时间复杂度为O(logn)
  3. 注意考虑数组中没有出现该数的情况

代码

public class Solution {
    public int GetNumberOfK(int [] array , int k) {
        int num = 0;
        if (array == null || array.length == 0) {
            return num;
        }
        int firstK = getFirstK(array, k, 0, array.length - 1);
        int lastK = getLastK(array, k, 0, array.length - 1);
        System.out.println("first:" + firstK + " lastK:" + lastK);
        if (firstK > -1 && lastK > -1) {
            return lastK - firstK + 1;
        }
        return num;


    }
    public int getFirstK(int[] data, int k, int start, int end) {
        if (start > end) {
            return -1;
        }
        int midIndex = (start + end) / 2;
        int midData = data[midIndex];
        if (midData == 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, k, start, end);
    }
    public int getLastK(int[] data, int k, int start, int end) {
        if (start > end) {
            return -1;
        }
        int midIndex = (start + end) / 2;
        int midData = data[midIndex];
        if (midData == k) {
            if ((midIndex < data.length - 1 && data[midIndex + 1] != k) || midIndex == data.length - 1) {
                return midIndex;
            } else {
                start = midIndex + 1;
            }
        } else if (midData > k) {
            end = midIndex - 1;
        } else {
            start = midIndex + 1;
        }
        return getLastK(data, k, start, end);
    }
}
原文地址:https://www.cnblogs.com/rosending/p/5656425.html