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

统计指定数字再排序数组中出现的次数。例如输入排序数组{1,2,3,3,3,3,4,5}和数字3,由于3在数组中出现了4次,输出4。

使用二分查找法

      由于数组是排序的我们应该很容易想到使用二分法查找指定数字。第一次查找中间值为3,等于我们要查找的数字,其他数字3可能在中间值的两侧,我们要查找到第一个3出现的位置和最后一个3出现的位置。

      第一个3出现的位置我们可以这样确定:如果中间值前一个元素不是3,说明中间值就是第一个3;如果前一个元素依旧是3,说明第一个3还在之前,再次使用二分法。最后一个3出现的位置思路相同。

实现代码:

//获取第一个指定元素出现的位置
private static int GetFirstK(int[] arr, int k,int left,int right) {
	if(left>right){
		return -1;
	}
	int mid = (left+right)/2;
	if(arr[mid]==k){
		if(mid>0&&arr[mid-1]!=k||mid==0){
			return mid;
		}else{
			right = mid-1;
		}
	}else{
		if(arr[mid]>k){
			right = mid-1;
		}else{
			left = mid+1;
		}
	}
	return GetFirstK(arr,k,left,right);
}
//获取最后一个指定元素出现的位置
private static int GetLastK(int[] arr, int k, int left, int right) {
	if(left>right){
		return -1;
	}
	int mid = (left+right)/2;
	if(arr[mid]==k){
		if(midk){
			right = mid-1;
		}else{
			left = mid+1;
		}
	}
	return GetLastK(arr,k,left,right);
}
//整合
private static int GetCountsOfNum(int[] arr, int k) {
	if(arr==null||arr.length==0){
		return -1;
	}
	int first = GetFirstK(arr,k,0,arr.length-1);
	int last = GetLastK(arr,k,0,arr.length-1);
	if(first>-1&&last>-1){
		return last-first+1;
	}
	return 0;
}

你可能感兴趣的:(算法,剑指Offer,Java实现)