zoukankan      html  css  js  c++  java
  • 数字在排序数组中出现的次数

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

    比如,输入排序数组{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

  • 相关阅读:
    ElasticSearch7.6学习使用及问题总结
    phpstorm2020.1破解及使用
    大规模网站开发技术
    备份数据库、恢复数据库、定时
    Centos7系统tmp目录下文件默认保留时长
    linux删除指定文件夹中某个文件除外的其他文件
    python resource模块使用
    python logging 日志轮转文件不删除问题的解决方法
    linux 常用命令快捷键
    shell学习笔记(4)
  • 原文地址:https://www.cnblogs.com/yxwkf/p/5367144.html
Copyright © 2011-2022 走看看