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

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

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

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

比如,输入排序数组{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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • vue 路由嵌套_vue多级路由嵌套

    vue 路由嵌套_vue多级路由嵌套嵌套路由有时候在路由中,主要的部分是相同的,但是下面可能是不同的。比如访问首页,里面有新闻类的/home/news,还有信息类的/home/message。这时候就需要使用到嵌套路由。项目结构如下:

    2022年7月29日
  • 二叉树中序遍历图示[通俗易懂]

    二叉树中序遍历图示[通俗易懂]一,中序遍历二叉树的算法1,调用自身来遍历节点的左子树2,访问这个节点3,调用自身来遍历节点的右子树二,实例三,方法调用tree.inOrder(tree.root);四,执行示意图总结:学习二叉树的时候,一直对遍历所用到的递推跟递归思想迷惘。现在使用示意图,觉得清晰多了,希望能帮有需要的人。…

    2022年9月14日
  • 金税盘计算机USB无法识别,金税盘无法识别怎么办

    金税盘计算机USB无法识别,金税盘无法识别怎么办摘要:这篇文章将给财务会计人员讲解金税盘无法识别怎么办相关的内容,在金税盘无法识别怎么办这篇财务资讯中我们详细讲解了有关金税盘无法识别怎么办的会计知识。金税盘无法识别怎么办部分情况可能是因为USB供电不稳定,造成金税盘驱动无法正常运行;建议电脑重启,金税盘数据线重新插拔一下或者更换一个USB端口连接试试.如果多次尝试无效,则需要联系服务单位处理.金税盘使用增值税防伪税控系统,可开具增值税专用发票和…

    2022年6月11日
  • 在线css三角形生成器 「干货」[通俗易懂]

    在线css三角形生成器 「干货」[通俗易懂]为了提高前端开发效率,笔者先后写了上百个前端工具,有些是给公司内部使用的,有些单纯是因为自己太“懒”,不想写代码,所以才“被迫”做的.接下来介绍的一款工具——css三角形生成器也是因为之前想要解放设计师的生产力,自己又懒得切图或者写css代码,所以想来想去还是自己做一个能自动生成css三角形代码的工具吧.接下来笔者就来带大家介绍一下这个工具的用途和实现方案,方便大家后续可以扩展出更多的“懒人工具”.在线css三角形生成器预览由预览动画我们可以看到通过在线工具我们可以轻松配置..

    2022年10月31日
  • JSP内置对象Session

    JSP内置对象Session1创建和获取客户的会话setAttribute()与getAttribute()session.setAttribute(Stringname,Objectobj)如session.setAt

    2022年7月2日
  • Git创建远程分支并提交代码到远程分支

    Git创建远程分支并提交代码到远程分支1、可以通过gitbranch-r命令查看远端库的分支情况如图所示,远程仓库只有一个master分支2、从已有的分支创建新的分支(如从master分支),创建一个dev分支但此时并没有在远程仓库上创建分支如图所示还是只有一个master分支3、建立本地到远端仓库的链接–这样代码才能提交上去使用命令行gitpush–set-…

    2022年6月30日

发表回复

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

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