博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
数字在排序数组中出现的次数
阅读量:5133 次
发布时间:2019-06-13

本文共 1408 字,大约阅读时间需要 4 分钟。

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

比如,输入排序数组{1,2,3,3,3,3,4,5}和数字3因为3在这个数组中出现了4次。因此输出4。

题目解法非常多。关键是要找到让人惬意的方法,直接统计当然能够。但是显然不是我们要的答案。
比較好的思路例如以下:
使用二分查找的拓展,当查找的元素有反复的时,找到元素的第一个和最后一个。

这样将能够计算出该元素有多少个反复的了。二分法在数组中查找一个合乎要求的数字时间复杂度是O(logn)。因此总的时间复杂度也仅仅有O(logn)。

//递归找到排序数组中第一个kint GetFirstK(int *data, int length, int k, int start, int end){	if(start>end)		return -1;	int middleIndex=(start+end)/2;	int middleData=data[middleIndex];	if (middleData==k)	{		//推断是否是第一个k		if ((middleIndex>0&&data[middleIndex-1]!=k)||middleIndex==0)		{			return middleIndex;		}		else		{//第一个k肯定在左边			end=middleIndex-1;		}	}	else if (middleData>k)	{		end=middleIndex-1;	}	else		start=middleIndex+1;	//递归	return GetFirstK(data,length,k,start,end);}//相同的思路,递归找到最后的一个kint GetEndK(int *data, int length, int k, int start, int end){	if(start>end)		return -1;	int middleIndex=(start+end)/2;	int middleData=data[middleIndex];	if (middleData==k)	{		if ((middleIndex
k) { end=middleIndex-1; } else { start=middleIndex+1; } return GetEndK(data,length,k,start,end);}//计算出k在数组中出现的次数int GetNumOfK(int *data, int length, int k){ int number=0; if (data!=NULL&&length>0) { int first=GetFirstK(data,length,k,0,length-1); int last=GetEndK(data,length,k,0,length-1); if (first>-1&&last>-1) { return last-first+1; } } return number;}
转载请注明出处:http://blog.csdn.net/lsh_2013/article/details/46367393

转载于:https://www.cnblogs.com/yxwkf/p/5367144.html

你可能感兴趣的文章
Spring JDBCTemplate
查看>>
Radon变换——MATLAB
查看>>
第五章笔记
查看>>
Iroha and a Grid AtCoder - 1974(思维水题)
查看>>
gzip
查看>>
转负二进制(个人模版)
查看>>
LintCode-Backpack
查看>>
查询数据库锁
查看>>
[LeetCode] Palindrome Number
查看>>
我对于脚本程序的理解——百度轻应用有感
查看>>
SQL更新某列包含XX的所有值
查看>>
网易味央第二座猪场落户江西 面积超过3300亩
查看>>
面试时被问到的问题
查看>>
spring 事务管理
查看>>
VS2008 去掉msvcr90的依赖
查看>>
当前记录已被另一个用户锁定
查看>>
Bootstrap
查看>>
Node.js 连接 MySQL
查看>>
ACM-ICPC 2018 world final A题 Catch the Plane
查看>>
那些年,那些书
查看>>