面試雜題(四)有序數組中連續k的個數(更高效的方法) .

這是二分搜索的一個應用,找到FirstK以及LastK

代碼比較簡單

int NumofK(int *pData,int nLen,int k)
{
	int nIndexLeft=GetFirstK(pData,nLen,k);
	if (nIndexLeft!=-1)
	{
		return GetLastK(pData,nLen,k)-nIndexLeft+1;
	}
	return 0;
}


int GetFirstK(int *pData,int nLen,int k)
{
	if (pData==NULL||nLen==0)
	{
		return -1;
	}

	unsigned int first=0;
	unsigned int last=nLen-1;

	while(first<last)
	{
		unsigned int mid=(first+last)/2;
		if (pData[mid]==k)
		{
			if ((pData[mid-1]!=k&&mid>0)||mid==0)
			{
				return mid;
			}
			last=mid;
			continue;

		}
		if (pData[mid]>k)
		{
			last=mid;
		}
		else
		{
			first=mid+1;
		}
	}
	if (pData[first]==k)
	{
		return first;
	}
	return -1;

}


int GetLastK(int *pData,int nLen,int k)
{
	if (pData==NULL||nLen==0)
	{
		return -1;
	}

	unsigned int first=0;
	unsigned int last=nLen-1;

	while(first<last)
	{
		unsigned int mid=(first+last)/2;
		if (pData[mid]==k)
		{
			if ((pData[mid+1]!=k&&mid<(unsigned int)(nLen-1))||mid==nLen-1)
			{
				return mid;
			}
			first=mid+1;
			continue;

		}
		if (pData[mid]>k)
		{
			last=mid;
		}
		else
		{
			first=mid+1;
		}
	}
	if (pData[first]==k)
	{
		return first;
	}
	return -1;

}


 

發佈了77 篇原創文章 · 獲贊 11 · 訪問量 9萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章