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

本文介绍了一种使用二分查找法确定数组中特定元素首次和末次出现位置的方法,进而高效计算该元素在有序数组中的出现次数。通过递归实现 getFirstPos 和 getEndPos 函数来定位目标值 k 的起始和终止索引。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

注意:在写代码的时候注意细节,注意细节,注意细节,重要的事情说三遍!!!


#include <iostream>
#include <stack>
#include <vector>
#include <algorithm>
#include <string>

using namespace std;


class Solution {
public:
    int GetNumberOfK(vector<int> data ,int k) {
        int start = getFirstPos(data,k,0,data.size()-1);
		int end = getEndPos(data,k,0,data.size()-1);

		int num = 0;

		if(start > -1 && end > -1)
		{
			num = end - start + 1;
		}
		return num;
    }

	/* 得到第一个数字的开始位置*/
	int getFirstPos(vector<int> data, int k ,int start ,int end)
	{
		if(start > end)
			return -1;

		int mid = (start + end) / 2;
		int middata = data[mid];

		

		if(middata == k)
		{
			/* 判断是不是开头 */
			if((mid >0 && data[mid-1] != k) || mid == 0)
			{
				return mid;
			}
			else
			{
				end = mid - 1;
			}
		}
		else
		{
			if(middata > k)
				end = mid -1;
			else
				start = mid + 1;
		}

		
		return getFirstPos(data,k,start,end);
	}

	/* 得到第一个数字的结束位置*/
	int getEndPos(vector<int> data, int k ,int start ,int end)
	{
		if(start > end)
			return -1;

		int mid = (start + end) / 2;
		int middata = data[mid];
		
		if(middata == k)
		{
			/* 判断是不是结尾 */
			if((mid < data.size() - 1  && data[mid+1] != k) || mid == data.size() - 1)
			{
				return mid;
			}
			else
			{
				start = mid + 1;
			}
		}
		else
		{
			if(middata > k)
				end = mid -1;
			else
				start = mid + 1;
		}
		
		return getEndPos(data,k,start,end);
	}


};

int main()
{
	int a[] = {1,2,3,3,3,3,4,5};
	Solution s;

	vector<int> vec(a,a+8);

	cout << s.GetNumberOfK(vec,3)<< endl; 

	return 0;
}


内容概要:本文档详细介绍了Analog Devices公司生产的AD8436真均方根-直流(RMS-to-DC)转换器的技术细节及其应用场景。AD8436由三个独立模块构成:轨到轨FET输入放大器、高动态范围均方根计算内核和精密轨到轨输出放大器。该器件不仅体积小巧、功耗低,而且具有广泛的输入电压范围和快速响应特性。文档涵盖了AD8436的工作原理、配置选项、外部组件选择(如电容)、增益调节、单电源供电、电流互感器配置、接地故障检测、三相电源监测等方面的内容。此外,还特别强调了PCB设计注意事项和误差源分析,旨在帮助工程师更好地理解和应用这款高性能的RMS-DC转换器。 适合人群:从事模拟电路设计的专业工程师和技术人员,尤其是那些需要精确测量交流电信号均方根值的应用开发者。 使用场景及目标:①用于工业自动化、医疗设备、电力监控等领域,实现对交流电压或电流的精准测量;②适用于手持式数字万用表及其他便携式仪器仪表,提供高效的单电源解决方案;③在电流互感器配置中,用于检测微小的电流变化,保障电气安全;④应用于三相电力系统监控,优化建立时间和转换精度。 其他说明:为了确保最佳性能,文档推荐使用高质量的电容器件,并给出了详细的PCB布局指导。同时提醒用户关注电介质吸收和泄漏电流等因素对测量准确性的影响。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

dmfrm

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值