- 标签(题目类型):数组、哈希表、分治、排序
题目描述
给定一个大小为 n 的数组 nums ,返回其中的多数元素。多数元素是指在数组中出现次数 大于 ⌊ n/2 ⌋ 的元素。
你可以假设数组是非空的,并且给定的数组总是存在多数元素。
示例 1:
输入:nums = [3,2,3]
输出:3
示例 2:
输入:nums = [2,2,1,1,1,2,2]
输出:2
提示:
n == nums.length
1 <= n <= 5 * 104
-109 <= nums[i] <= 109
进阶:尝试设计时间复杂度为 O(n)、空间复杂度为 O(1) 的算法解决此问题。
思路及实现
方式一:哈希表
思路
通过哈希表来记录每个元素出现的次数,然后遍历哈希表找到出现次数大于 n/2 的元素。
代码实现
Java版本
import java.util.HashMap;
import java.util.Map;
public class MajorityElement {
public int majorityElement(int[] nums) {
Map<Integer, Integer> countMap = new HashMap<>();
int n = nums.length;
// 统计每个元素出现的次数
for (int num : nums) {
countMap.put(num, countMap.getOrDefault(num, 0) + 1);
if (countMap.get(num) > n / 2) {
return num;
}
}
// 如果没有找到,则抛出异常(但根据题目描述,总是会存在多数元素)
throw new IllegalStateException("No majority element found, but it should exist according to the problem description.");
}
}
说明:
- 使用
HashMap
来存储元素及其出现的次数。- 在遍历数组时,更新哈希表中每个元素的出现次数。
- 如果某个元素的出现次数大于 n/2,则直接返回该元素。
- 题目描述中提到总是存在多数元素,所以如果没有找到多数元素,则抛出异常(但这种情况不会发生)。
C语言版本
由于C语言标准库中没有直接提供哈希表,我们通常需要自己实现或使用第三方库。这里提供一个使用C语言实现哈希表的简化示例,但请注意,这不是C语言的标准做法,实际应用中可能需要更复杂的哈希表实现。
#include <stdio.h>
#include <stdlib.h>
#define HASH_SIZE 1000
typedef struct Node {
int key;
int count;
struct Node* next;
} Node;
Node* hashTable[HASH_SIZE];
// 哈希函数
int hash(int key) {
return key % HASH_SIZE;
}
// 插入或更新哈希表中的元素
void insertOrUpdate(int key) {
int index = hash(key);
Node* current = hashTable[index];
// 如果链表为空,创建新节点
if (current == NULL) {
hashTable[index] = (Node*)malloc(sizeof(Node));
hashTable[index]->key = key;
hashTable[index]->count = 1;
hashTable[index]->next = NULL;
} else {
// 遍历链表找到对应节点或创建新节点
while (current != NULL) {
if (current->key == key) {
current->count++