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

    通过二分查找,找到k在数组中第一次出现的位置和最后一次出现的位置。

    #include <iostream>
    using namespace std;
    
    int GetFirstK(int *data,int length,int k,int start,int end)
    {
    	if (start>end)
    	{
    		return -1;
    	}
    	int middleIndex=start+(end-start)/2;
    	int middleData=data[middleIndex];
    	if (middleData==k)
    	{
    		if (middleIndex>0&&data[middleIndex-1]!=k||middleIndex==0)
    		{
    			return middleIndex;
    		}
    		else
    		{
    			end=middleIndex-1;
    		}
    	}
    	else if(middleData>k)
    	{
    		end=middleIndex-1;
    	}
    	else
    	{
    		start=middleIndex+1;
    	}
    	return GetFirstK(data,length,k,start,end);
    }
    
    int GetLastK(int *data,int length,int k,int start,int end)
    {
    	if (start>end)
    	{
    		return -1;
    	}
    	int middleIndex=start+(end-start)/2;
    	int middleData=data[middleIndex];
    	if (middleData==k)
    	{
    		if (middleIndex<length-1&&data[middleIndex+1]!=k||middleIndex==0)
    		{
    			return middleIndex;
    		}
    		else
    		{
    			start=middleIndex+1;
    		}
    	}
    	else if(middleData>k)
    	{
    		end=middleIndex-1;
    	}
    	else
    	{
    		start=middleIndex+1;
    	}
    	return GetLastK(data,length,k,start,end);
    }
    
    int GetNumberOfK(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=GetLastK(data,length,k,0,length-1);
    		if (first>-1&&last>-1)
    		{
    			number=last-first+1;
    		}	
    	}
    	return number;
    }
    
    int main()
    {
    	int a[]={1,2,2,2,3,3,3,3,3,3,4,4,5,6};
    	cout<<GetNumberOfK(a,14,3)<<endl;
    	return 0;
    }
  • 相关阅读:
    python之json&pickle
    python之装饰器
    软件测试基础
    软件测试分类
    python3文件的读写操作
    python3对excel文件读写操作
    Java集合整理
    mybatis一对多关系的关联查询
    用xftp从win7系统传输一些必要的文件到Linux
    Spring和Mybatis的整合
  • 原文地址:https://www.cnblogs.com/dgy5554/p/3973381.html
Copyright © 2011-2022 走看看