《剑指Offer——数字在排序数组中出现的次数》代码

Posted 穿迷彩服的鲨鱼

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了《剑指Offer——数字在排序数组中出现的次数》代码相关的知识,希望对你有一定的参考价值。


前言

//==================================================================
// 《剑指Offer——数字在排序数组中出现的次数》代码
// 题目:统计一个数字在排序数组中出现的次数。例如输入排序数组{1, 2, 3, 3,
// 3, 3, 4, 5}和数字3,由于3在这个数组中出现了4次,因此输出4。
//==================================================================


一、示例

示例 1:

输入: nums = [5,7,7,8,8,10], target = 8
输出: 2
示例 2:

输入: nums = [5,7,7,8,8,10], target = 6
输出: 0

二、代码解析

1.新建.cpp文件

代码如下(示例):

//==================================================================
// 《剑指Offer——数字在排序数组中出现的次数》代码
// 题目:统计一个数字在排序数组中出现的次数。例如输入排序数组{1, 2, 3, 3,
// 3, 3, 4, 5}和数字3,由于3在这个数组中出现了4次,因此输出4。
//==================================================================



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

/*法一*/
int search1(vector<int>& nums, int target)
{
	int duplication = 0;
	for (int i = 0; i < nums.size(); ++i)
	{
		if (nums[i] == target)
		{
			duplication++;
			if (target != nums[i])
			{
				return duplication;
			}
		}
	}
	return duplication;
}

/*二分查找+递归------法二*/

/*找到数组中第一个K的下表,如果数组中不存在K,返回-1*/
int GetFirstK(vector<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 > 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);
}

/*找到数组中最后一个K的下表,如果数组中不存在K,返回-1*/
int GetLastK(vector<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)
	{
		start = middleIndex + 1;
	}
	else
	{
		end = middleIndex - 1;
	}
	return GetLastK(data, length, k, start, end);
}

/*计算次数*/
int GetNumberOfK(vector<int>& data, int length, int k)
{
	int number = 0;
	if (!data.empty() && 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 search2(vector<int>& nums, int target)
{
	return GetNumberOfK(nums, nums.size(), target);
}

/*测试代码*/
int main(void)
{
	vector<int> nums = { 5,7,7,8,8,10 };
	int target = 8;


	cout << "法一----->" << search1(nums, target) << endl;
	cout << "法二----->" << search2(nums, target) << endl;
	return 0;
}


2.测试

以上是关于《剑指Offer——数字在排序数组中出现的次数》代码的主要内容,如果未能解决你的问题,请参考以下文章

剑指Offer-数字在排序数组中出现的次数

剑指offer 37.数字在排序数组中出现的次数

剑指offer(二十七)之数字在排序数组中出现的次数

剑指offer数字在排序数组中出现的次数

剑指offer 数字在排序数组中出现的次数

剑指offer-数字在排序数组中出现的次数