news 2026/5/25 14:52:00

[特殊字符] 高效统计排序数组中目标元素的出现次数

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
[特殊字符] 高效统计排序数组中目标元素的出现次数

给定一个已排序的数组和一个目标值,如何快速统计该目标值在数组中出现的次数?这是面试中非常经典的一道题,今天就来聊聊两种解法:线性搜索和二分搜索。

问题描述

假设有一个已排序的数组arr[]和一个整数target,需要找出target在数组中出现的次数。

示例:

  • 输入:arr[] = [1, 1, 2, 2, 2, 2, 3],target = 2

  • 输出:4(2 出现了 4 次)

  • 输入:arr[] = [1, 1, 2, 2, 2, 2, 3],target = 4

  • 输出:0(4 不在数组中)

方法一:线性搜索(暴力法)

思路:遍历整个数组,遇到与目标值相等的元素就计数加 1。

代码实现(Python):

defcountFreq(arr,target):res=0foriinrange(len(arr)):ifarr[i]==target:res+=1returnres arr=[1,1,2,2,2,2,3]target=2print(countFreq(arr,target))# 输出 4

复杂度分析:

  • 时间复杂度:O(n),因为需要遍历整个数组。
  • 空间复杂度:O(1),只用了常数空间。

这种方法简单直观,但当数组很大时效率较低。

刷算法题时,遇到“排序数组中查找目标元素出现次数”这类问题,你是不是也卡在边界条件和二分查找的细节上?其实,理解这类问题的核心,关键在于把抽象的逻辑“看”清楚。强烈安利一个神器——图码,它提供60多种数据结构和算法的交互式动画可视化,能帮你把二分查找的每一步都“动”起来。更绝的是,你可以直接上传自己的C/C++/Java/Python代码,或者输入自定义数据,让网站自动生成动画,直观看到代码执行过程。无论你是备战408考研,还是准备数据结构期末考试,它都能把晦涩的算法拆解得明明白白。现在就去看看吧,说不定能让你少走很多弯路!

图码-数据结构与算法交互式可视化平台
访问网站:https://totuma.cn

方法二:二分搜索(最优解)

既然数组是已排序的,我们可以利用二分搜索来加速。核心思想是:

  1. 找到目标值的第一次出现位置(下界)
  2. 找到第一个大于目标值的位置(上界)
  3. 两者之差就是目标值的出现次数

代码实现(Python,使用内置函数):

frombisectimportbisect_left,bisect_rightdefcountFreq(arr,target):l=bisect_left(arr,target)r=bisect_right(arr,target)returnr-l arr=[1,2,2,2,2,3,4,7,8,8]target=2print(countFreq(arr,target))# 输出 4

手动实现二分搜索(C++ 风格):

#include<iostream>#include<vector>#include<algorithm>usingnamespacestd;intcountFreq(vector<int>&arr,inttarget){intl=lower_bound(arr.begin(),arr.end(),target)-arr.begin();intr=upper_bound(arr.begin(),arr.end(),target)-arr.begin();returnr-l;}intmain(){vector<int>arr={1,2,2,2,2,3,4,7,8,8};inttarget=2;cout<<countFreq(arr,target);// 输出 4return0;}

复杂度分析:

为什么二分搜索更快?

线性搜索需要遍历整个数组,当数组有 10 万个元素时,最坏情况要比较 10 万次。而二分搜索每次将搜索范围减半,只需比较约 log₂(100000) ≈ 17 次。

总结

方法时间复杂度空间复杂度适用场景
线性搜索O(n)O(1)小数组或未排序数组
二分搜索O(log n)O(1)已排序的大数组

如果数组是已排序的,强烈推荐使用二分搜索,效率高且实现简单。如果数组未排序,可以先排序再二分,但排序本身需要 O(n log n) 时间,此时线性搜索可能更合适。

希望这篇文章对你有帮助!如果你有其他解法或问题,欢迎在评论区讨论~

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/25 14:47:02

5分钟掌握微信小程序AR 3D开发:从零到部署完整指南

5分钟掌握微信小程序AR 3D开发&#xff1a;从零到部署完整指南 【免费下载链接】WeChat-MiniProgram-AR-3D A WeChat MiniProgram 3D that includes a Panorama Viewer and a 3D Viewer using the device orientation control. 项目地址: https://gitcode.com/gh_mirrors/we/…

作者头像 李华
网站建设 2026/5/25 14:46:05

KAN模型不确定性量化:保形预测为科学机器学习提供统计保证

1. 项目概述&#xff1a;当KAN遇上保形预测&#xff0c;为科学机器学习注入“确定性”在科学机器学习领域&#xff0c;我们常常面临一个核心矛盾&#xff1a;模型给出的预测结果&#xff0c;我们究竟能相信多少&#xff1f;尤其是在数据稀缺、物理过程复杂或决策成本高昂的场景…

作者头像 李华
网站建设 2026/5/25 14:46:03

从模糊到电影级:Midjourney烟雾效果进阶四阶训练法,含12组可直接复用的烟雾-环境耦合Prompt模板(仅限本期开放下载)

更多请点击&#xff1a; https://codechina.net 第一章&#xff1a;从模糊到电影级&#xff1a;Midjourney烟雾效果进阶四阶训练法&#xff0c;含12组可直接复用的烟雾-环境耦合Prompt模板&#xff08;仅限本期开放下载&#xff09; 烟雾是视觉叙事中最富张力的动态元素之一—…

作者头像 李华
网站建设 2026/5/25 14:45:00

终极Windows键盘重映射解决方案:SharpKeys完全指南

终极Windows键盘重映射解决方案&#xff1a;SharpKeys完全指南 【免费下载链接】sharpkeys SharpKeys is a utility that manages a Registry key that allows Windows to remap one key to any other key. 项目地址: https://gitcode.com/gh_mirrors/sh/sharpkeys 还在…

作者头像 李华