数字在排序数组中出现的次数「建议收藏」

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

大家好,又见面了,我是全栈君。

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

比如,输入排序数组{1,2,3,3,3,3,4,5}和数字3因为3在这个数组中出现了4次。因此输出4。
题目解法非常多。关键是要找到让人惬意的方法,直接统计当然能够。但是显然不是我们要的答案。
比較好的思路例如以下:
使用二分查找的拓展,当查找的元素有反复的时,找到元素的第一个和最后一个。

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

//递归找到排序数组中第一个k
int 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);
}

//相同的思路,递归找到最后的一个k
int 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<length-1&&data[middleIndex+1]!=k)||middleIndex=length-1)
		{
			return middleIndex;
		}
		else
			start=middleIndex+1;
	}
	else if (middleData>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://javaforall.net/115428.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 计算机网络原理(谢希仁第八版)第一章课后习题答案

    第一章1.计算机网络可以向用户提供哪些服务?答:例如音频,视频,游戏等,但本质是提供连通性和共享这两个功能。连通性:计算机网络使上网用户之间可以交换信息,好像这些用户的计算机都可以彼此直接连通一样。共享:指资源共享。可以是信息,软件,也可以是硬件共享。2.试简述分组交换的要点。答:采用了存储转发技术。把报文(要发送的整块数据数据)等分成若干数据段,每个数据段加入控制信息组成的首部(header),构成若干分组。因为分组首部包含了目的地址和原地址等重要控制信息,每个分组才可以在互联网中独立地选择传

    2022年4月8日
    555
  • Override ListView getAdapter造成的后果

    Override ListView getAdapter造成的后果

    2021年11月23日
    45
  • Pycharm连接并调用服务器「建议收藏」

    Pycharm连接并调用服务器「建议收藏」Pycharm可以与服务器建立连接,把相应的项目同步到服务器上,并且可以通过Pycharm直接使用服务器的解释器运行相应程序,实现Pycharm编程,服务器运行的效果。具体步骤如下:1.建立一个服务器连接Pycharm的“Tools”-》“Deployment”-》“Configuration”2.创建一个SFTP3.为该项目添加一个SSH解释器。因为前面已经添加好了服务器连接,所以这里直接选择已经设置好的就可以,如果没有已经设置好的,可以重新添加。配置好SSH之后,选择Next,设置本地项目

    2022年8月28日
    1
  • html中怎么让表格居中_html表格上下居中

    html中怎么让表格居中_html表格上下居中回答:IE6/7及IE8混杂模式中,text-align:center可以使块级元素也居中对齐。其他浏览器中,text-align:center仅作用于行内内容上。解决这个问题比较好的方式,就是为所有需要相对父容器居中对齐的块级元素设置“margin-left:Auto;margin-right:Auto”。但这个方式IE6/IE7/IE8的混杂模式中不支持,所以还要设置父容器的”text…

    2025年11月10日
    5
  • HttpCanary下载_简单自我介绍网页代码

    HttpCanary下载_简单自我介绍网页代码前言首先,我们无论学习哪个框架,都要带着问题,带着思考去学习思考1:HttpRunner是什么?思考2:HttpRunner的设计模式是什么?思考3:为什么我们要学习HttpRunner?他的

    2022年7月30日
    5
  • c++ 常量表达式_c++符号常量

    c++ 常量表达式_c++符号常量常量表达式主要是允许一些计算发生在编译时,即发生在代码编译阶段而不是代码运行阶段。这是很大的优化,因为如果有些事情可以在编译时做,那么它只会做一次,而不是每次程序运行时都计算。使用constexpr,你可以创建一个编译时的函数:constexprintgetConst(){ return3;}voidtest07(){ intarr[getConst()]={0}…

    2022年9月29日
    3

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号