《剑指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——数字在排序数组中出现的次数》代码的主要内容,如果未能解决你的问题,请参考以下文章