给一个长度为n的数组,数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字、
时间: 2024-10-11 15:06:06 浏览: 36
LonelyNumber:在整数数组中寻找孤独整数的算法,其中每个数字出现 3 次,除了 1
这个问题属于二分查找算法和哈希表结合的经典场景,通常称为“寻找众数”(Majority Element)。以下是基本的解决方案步骤:
1. 创建一个大小为`n`的布尔型哈希表`count[]`,初始化所有元素为`false`。
2. 遍历数组`arr`,对于每个元素`num`:
a. 检查`count[num]`。如果是`false`,设置为`true`并将计数加一。
b. 如果是`true`,则计数减一。
c. 当计数变为负数时,说明找到了一个小于一半的值,清零计数,并从当前索引开始,继续搜索。
3. 当遍历结束后,剩下的非零计数的元素就是出现次数超过一半的数。
下面是一个简单的C++示例:
```cpp
#include <vector>
using namespace std;
int findMajorityElement(vector<int>& nums) {
int count = 0, majorityElement = -1;
unordered_map<int, int> hashTable;
for (int num : nums) {
hashTable[num]++;
if (hashTable[num] == 1)
count--;
else if (hashTable[num] > 1)
count++;
if (count == 0)
majorityElement = num;
}
return majorityElement;
}
int main() {
vector<int> arr = {1, 2, 2, 3, 3, 3}; // 示例数组
int n = arr.size();
cout << "多数元素是: " << findMajorityElement(arr) << endl;
return 0;
}
```
这段代码首先遍历数组,将每个元素的计数存储在哈希表中。然后更新计数,当计数变为0时,我们已经找到一个候选的多数元素。最后,遍历完成后,`majorityElement`就是出现次数超过数组长度一半的数字。
阅读全文