码迷,mamicode.com
首页 > 编程语言 > 详细

求排序数组中数字k出现的次数

时间:2015-04-08 13:17:08      阅读:156      评论:0      收藏:0      [点我收藏+]

标签:二分查找

思路:如果从头到尾遍历数组,那时间复杂度是O(n).我们可以利用题目给出的条件,由于是排序数组,我们可以利用二分查找来实现 时间复杂度为O(log2N)


具体代码如下:

#include<iostream>
#include<cassert>
using namespace std;

int findfirstk(int *ar, int len, int k, int start, int end)//利用二分查找找到第一个k出现的位置
{
	if(start > end)
	{
		return -1;
	}
	

	int mid = (end-start)/2 +start;
	if(ar[mid] == k)
	{
		if(mid>0&&ar[mid-1]!=k || mid==0)//找到第一个k
		{
			return mid;
		}
		else
		{
			end = mid - 1;
		}
	}
	else if(ar[mid] > k)
	{
		end = mid - 1;
	}
	else
	{
		start = mid + 1;
	}
	return findfirstk(ar, len, k, start, end);
}

int findlastk(int *ar, int len, int k, int start, int end)//利用二分查找找到最后一个k出现的位置
{
	if(start > end)
	{
		return -1;
	}

	int mid = (end-start)/2 +start;
	if(ar[mid] == k)
	{
		if(mid<len-1&&ar[mid+1]!=k || mid==len-1)//找到最后一个k
		{
			return mid;
		}
		else
		{
			start = mid + 1;
		}
	}
	else if(ar[mid] > k)
	{
		end = mid - 1;
	}
	else
	{
		start = mid + 1;
	}
	return findlastk(ar, len, k, start, end);
}

int gettimesk(int *ar, int len, int k)
{
	assert(ar != NULL);
	int times = 0;

	int first = findfirstk(ar, len, k, 0, len-1);
	int last = findlastk(ar, len, k, 0, len-1);
	if(first>-1 && last>-1 && len>0)
	{
		times = last-first+1;
	}
	return times;
}

int main()
{
	int ar[] = {1,2,3,4,4,5,6,6,6,6,6,7,7,7,7,8,8,9,9,9,9,9,10};
	int len = sizeof(ar)/sizeof(ar[0]);

	int k;
	cin>>k;
	cout<<"数字 "<<k<<" 出现了 "<<gettimesk(ar, len, k)<<" 次"<<endl;

	return 0;
}


求排序数组中数字k出现的次数

标签:二分查找

原文地址:http://blog.csdn.net/huai1693838234/article/details/44938029

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!