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

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

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

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

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


相关推荐

  • Java和JavaScript之间的区别

    Java和JavaScript之间的区别1.简介我们将在本文中比较Java语言和JavaScript语言。JavaScript由Netscape开发。它最初是用于客户端的脚本语言,后来又用作客户端和服务器脚本的语言。Java由JamesGosling由SunMicrosystems开发。这些天来,JavaScript在服务器中以node.js的形式使用。Java和JavaScript之间在程序编码,编译和运行方式方…

    2022年7月7日
    17
  • CPU C-state & cpuidle driver[通俗易懂]

    CPU C-state & cpuidle driver[通俗易懂]1.什么是C-states、C-mode?为了在CPU空闲时节约能源,可以命令CPU进入低功耗模式。C-state是intelCPU处于空闲时的一种状态,CPU有几种电源模式,它们统称为“c状态”或“c模式”低功耗模式最初是在486DX4处理器中引入的。到目前为止,已经引入了更多的功耗模式,并且对每种模式进行了增强,以使CPU在这些低功耗模式下消耗更少的功率。CPU的每个状态都使用不同的电量,并且对应用程序性能的影响也不同。每当CPU内核处于空闲状态时,内置的节能逻辑就会启动,并尝试将内核从当前

    2025年7月13日
    0
  • scl语言用plc脉冲做定时器_PLC编程,如何学习SCL语言?SCL语言编程入门「建议收藏」

    scl语言用plc脉冲做定时器_PLC编程,如何学习SCL语言?SCL语言编程入门「建议收藏」随着现代工控技术的不断发展,可能很多使用过PLC的技术人员都有这么一个感受:传统的‘梯形图’编程方式在面对越来越复杂的控制要求时,已显得力不从心。其实,现在很多大品牌的中高级PLC都支持国际电工委员会IEC61131标准中规范的五种编程语言的混合编程,即梯形图(LD)、结构化文本(ST)、流程图(SFC)、指令表(IL)和功能块(FB)。在这五种编程语言中,梯形图+结构化文本是一…

    2022年10月6日
    0
  • 分布式锁的实现和应用场景_predis分布式锁的应用

    分布式锁的实现和应用场景_predis分布式锁的应用文章目录如何理解分布式锁分布式锁的常用实现基于关系型数据库存在单点故障风险不可重入无法实现阻塞应用Redis缓存基于ZooKeeper实现电商网站都会遇到秒杀、特价之类的活动,大促活动有一个共同特点就是访问量激增,在高并发下会出现成千上万人抢购一个商品的场景。虽然在系统设计时会通过限流、异步、排队等方式优化,但整体的并发还是平时的数倍以上,参加活动的商品一般都是限量库存,如何防止库存超卖,避免并发问题呢?分布式锁就是一个解决方案。如何理解分布式锁我们都知道,在业务开发中,为了保证在多线程下处理

    2022年9月7日
    0
  • mysql倒序截取字符串_MySQL数据库之mysql截取字符串与reverse函数

    mysql倒序截取字符串_MySQL数据库之mysql截取字符串与reverse函数本文主要向大家介绍了MySQL数据库之mysql截取字符串与reverse函数,通过具体的内容向大家展现,希望对大家学习MySQL数据库有所帮助。这个网页上很多知识点,可以学习下,关于mysql的函数,也可以作为API查询:这里只说下mysql的截取函数和reverse函数:MySQL字符串截取函数:left(),right(),substring(),substring_index()…

    2025年6月16日
    0
  • 使用PyCharm快速安装TensorFlow

    使用PyCharm快速安装TensorFlow本来之前写的《使用VirtualEnv在Mac安装TensorFlow》已经搭建好TensorFlow学习环境了,后来发现使用PyCharm搭建TensorFlow学习环境简直不要太方便了,就重新搭建了一遍!启动PyCharm,创建一个新项目,选择Newenvironmentusing->VirtualEnv,这样就是单独为新项目创建一个隔离的python环境。创建好新项目以后…

    2022年8月27日
    7

发表回复

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

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