力扣169. 多数元素(Java/C/Python3实现含注释说明,简单)

本文介绍了如何使用哈希表、排序算法(如快速排序)以及摩尔投票算法解决LeetCode169题——找出数组中的多数元素。文章详细展示了三种方法的思路、代码实现以及复杂度分析。

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

  • 标签(题目类型):数组、哈希表、分治、排序

题目描述

给定一个大小为 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) 的算法解决此问题。

原题:leetcode 169. 多数元素

思路及实现

方式一:哈希表

思路

通过哈希表来记录每个元素出现的次数,然后遍历哈希表找到出现次数大于 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++
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值