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

博客聚焦于统计排序数组中某个数字的出现次数,这在信息技术领域的数据处理和分析中较为常见,可用于对特定数据的量化统计。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

package June;

public class 统计数在排序数组中出现次数 {
	public int GetNumberOfK(int[] array, int k) {
	/*	//最简单,一次循环遍历
		int count=0;
		for(int i=0;i<array.length;i++){
			if(array[i]==k){
				count++;
			}
		}
		return count;*/
		
		//二分查找算法,因为是排序好的,在数据大的情况下,这种算法更优
		//若K出现多次,则查找数组中K最左侧的下标,再查找数组中K最右侧下标,相减得出次数,
		//这种算法,比一次遍历要快
		if(array.length==0) return 0;
		int FirstKey=getFirstKey(array,k,0,array.length-1);
		int LastKey=getLastKey(array,k,0,array.length-1);
		if(FirstKey!=-1&&LastKey!=-1)
		   return LastKey-FirstKey+1;
		return 0;
				
	}
	//递归二分查找,返回-1说明没有找到,返回最左侧K下标
	private int getFirstKey(int []array,int k,int begin,int end){
		//一次没有找到K的情况
		if(begin>end) return -1;
		int middle=(begin+end)/2;
		//左侧
		if(k<array[middle]){
			return getFirstKey(array,k,begin,middle-1);
		}//右侧
		else if(k>array[middle]){
			return getFirstKey(array, k, middle+1, end);
		}//找到一个相等的,则往左边继续查找,直到找到最左边的一个K
		else if(middle-1>=0&&array[middle-1]==k){
			return getFirstKey(array, k, begin, middle-1);
		}//左侧没有,找到的是当前最左侧的K
		else{
			return middle;
		}
	}
	//循环二分查找
	private int getLastKey(int []array,int k,int begin,int end){
		if(begin>end) return -1;
		int middle;
		while(begin<=end){
			middle=(begin+end)/2;
			if(k<array[middle]){
				end=middle-1;
			}else if(k>array[middle]){
				begin=middle+1;
			}
			//找到一个相等的,往右侧继续查找
			else if(middle+1<array.length&&k==array[middle+1]){
				begin=middle+1;
			}
			// 当前最右侧
			else{
				return middle;
			}
		}
		return -1;
	}
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值