【1】题目
题目:统计一个数字在排序数组中出现的次数。例如输入排序数组{1,2, 3,3,3,3,4,5}和数字3,由于3在这个数组中出现了4次,因此输出4。
【2】思路
我们先分析如何用二分查找算法在数组中找到第一个k。二分查找算法总是先拿数组中间的数字和k作比较。如果中间的数字比k大,那么k只有可能出现在数组的前半段,下一轮我们只在数组的前半段查找就可以了。如果中间的数字比k 小,那么k 只有可能出现在数组的后半段,下一轮我们只在数组的后半段查找就可以了。如果中间的数字和 k 相等呢?我们先判断这个数字是不是第一个k。如果位于中间数字的前面一个数字不是k,此时中间的数字刚好就是第一个k。如果中间数字的前面一个数字也是k,也就是说第一个 k 肯定在数组的前半段,下一轮我们仍然需要在数组的前半段查找。
【3】代码
// Test37.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//
#include "pch.h"
#include <iostream>
#include<string>
using namespace std;
int GetFirstK(int *data, int length, int k, int start, int end)
{
if (start>end)
{
return -1;
}
int middleindex = int((start + end) / 2);
int middledata = data[middleindex];
if (middledata==k)//输入数据就是一个值,就直接返回,多个值,则当前值的前一个为起始值
{
//middleindex > 0 && data[middleindex - 1] != k 表示这个元素刚好位于第一位;
// data[middleindex]==0表示这个元素为0;
if( middleindex>0 && data[middleindex-1] !=k|| data[middleindex]==0)
{
return middleindex;
}
end = middleindex - 1;
}
else if(middledata > k)
{
end= middleindex - 1;
}
else//middledata < k
{
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) / 2;
int middledata = data[middleindex];
if (middledata == k)//输入数据就是一个值,就直接返回,多个值,则当前值的前一个为起始值
{
//middleindex > 0 && data[middleindex - 1] != k 表示这个元素刚好位于第一位;
// data[middleindex]==0表示这个元素为0;
if (middleindex <length-1 && data[middleindex +1] != k || data[middleindex] == length-1)
{
return middleindex;
}
start= middleindex + 1;
}
else if (middledata > k)
{
end = middleindex - 1;
}
else//middledata < k
{
start = middleindex + 1;
}
return GetLastK(data, length, k, start, end);
}
int GetNumberOfK(int *data, int k, int length)
{
int number = 0;
if (data!=nullptr&&length>0)
{
int first_index = GetFirstK(data, length, k, 0, length - 1);
int last_index = GetLastK(data, length, k, 0, length - 1);
std::cout << first_index << " ," << last_index <<std::endl;
if (first_index>-1 && last_index>-1)
{
number = last_index - first_index + 1;
}
}
return number;
}
void main()
{
int data[] = {1,2,3,3,3,3,5,7};
int k = 3;
int length = 8;
int result = GetNumberOfK(data, k, length);
printf("数组具有%d的个数有%d", k, result);
}