剑指Offer系列-面试题38:数字在排序数组中出现的次数

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

思路:二分查找该数字第一次出现的位置,然后找最后一次出现的位置,相减即可。用二分查找,时间复杂度为O(log n)。

代码:

public int GetNumberOfK(int [] array , int k) {
	if (array == null || array.length <= 0) {
		return 0;
	}
	int start = GetFirstK(array, k, 0, array.length - 1);
	if (start < 0) {
		return 0;
	}
	System.out.println(start);
	int end = GetLastK(array, k, start, array.length - 1);
	System.out.println(end);
	if (end < 0) {
		return 0;
	}
	return end - start + 1;
}

private int GetFirstK(int [] array, int k, int start, int end) {
	if (start > end) {
		return -1;
	}
	int mid = (start + end) / 2;
	int midData = array[mid];
	if (midData == k) {
		// 如果中间位置的前边不是k,或者此位置就是0,那么就是找到了,返回
		if ((mid > 0 && array[mid - 1] != k) || mid == 0) {
			return mid;
		} else { // 否则,要找的位置在左边
			end = mid - 1;
		}
	} else if (midData > k) { // 要找的位置在左边
		end = mid - 1;
	} else { // 要找的位置在右边
		start = mid + 1;
	}
	return GetFirstK(array, k, start, end);
}

private int GetLastK(int [] array, int k, int start, int end) {
	if (start > end) {
		return -1;
	}
	int mid = (start + end) / 2;
	int midData = array[mid];
	if (midData == k) {
		if ((mid < array.length - 1 && array[mid + 1] != k) || mid == array.length - 1) {
			return mid;
		} else {
			start = mid + 1;
		}
	} else if (midData > k) {
		end = mid - 1;
	} else {
		start = mid + 1;
	}
	return GetLastK(array, k, start, end);
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值