找出排序数组中重复数字的个数

本文讨论了如何改进二分查找算法来高效地找到目标元素的第一个和最后一个出现位置,避免了传统方法可能退化为线性时间复杂度的问题。

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

开始我的思路是先二分查找找到一个,然后再两边分别看个数。

但是这种方法会退化到O(n)。效率不好。

 

所以更好的方法是,先找出第一个,再找出最后一个。这个在二分查找的时候,通过判断条件的处理,是能够获得的。

比较基本的思路是,如果找到的数=k,那么判断前面一个数是不是k,如果不是,停止查找,这个是第一个;如果是的,那么继续在前半部分查找。领悟

 

### C++统计数组重复元素数量的方法 对于给定的任务,在C++中可以通过多种方法统计数组内的重复元素及其出现次数。一种常见的方式是先对数组进行排序,之后遍历已排序数组并记录相邻相等元素的数量。 下面展示了一种基于此思路的具体实现方案: ```cpp #include <iostream> #include <vector> #include <algorithm> using namespace std; void countDuplicates(vector<int>& nums) { // 对输入向量进行升序排列 sort(nums.begin(), nums.end()); int prevNum = INT_MIN; int occurrenceCount = 0; cout << "Element\tFrequency\n"; for (auto& num : nums) { if (num != prevNum) { if (occurrenceCount > 1 && prevNum != INT_MIN) cout << prevNum << "\t" << occurrenceCount << endl; prevNum = num; occurrenceCount = 1; } else { ++occurrenceCount; } } // 输出最后一个元素的信息(如果它是一个重复项) if (occurrenceCount > 1) cout << prevNum << "\t" << occurrenceCount << endl; } ``` 上述代码首先利用`sort()`函数对整个数组进行了排序处理[^1]。接着定义了一个辅助变量用于保存前一次迭代中的值(`prevNum`)以及另一个用来追踪当前正在考察的那个数字出现了多少次(`occurrenceCount`)。当遇到新的不同数值时,则打印之前那个数目的频率;而每当发现连续相同的整数就增加计数器直到结束为止[^2]。 除了这种方法外,还可以采用哈希表或者集合这样的数据结构来进行更高效的查找操作,尤其是在不允许修改原始序列的情况下更为适用。这些高级的数据结构可以提供常数级别的访问性能,从而使得整体效率更高[^3]。 另一种可能的选择就是使用标准库<algorithm>头文件里的count_if()算法配合lambda表达式一起工作,这能极大简化逻辑表述的同时保持良好的可读性和维护性[^4]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值