当前位置: 面试刷题>> 主元素Ⅰ (经典算法题500道)


题目描述补全:

主元素Ⅰ

在一个整数数组nums中,如果存在一个数出现的次数大于数组长度的一半,那么这个数就被称为主元素(也称为多数元素)。现在要求你编写一个函数,用于判断给定的整数数组nums是否存在主元素,并返回该主元素(如果存在)。如果不存在主元素,则返回nullNone(取决于你使用的编程语言)。

示例:

  • 输入:nums = [3, 2, 3]

  • 输出:3

  • 输入:nums = [2, 2, 1, 1, 1, 2, 2]

  • 输出:2

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

  • 输出:null(或None

解题思路:

一种常见的解题思路是使用摩尔投票算法(Boyer-Moore Voting Algorithm)。该算法的基本思想是,由于主元素出现的次数大于数组长度的一半,因此当遍历数组时,可以不断抵消非主元素,直到找到可能的候选主元素。然后,再次遍历数组验证该候选主元素是否确实满足条件。

PHP 示例代码:

function majorityElement($nums) {
    $candidate = null;
    $count = 0;
    
    // Step 1: 找到候选主元素
    foreach ($nums as $num) {
        if ($count === 0) {
            $candidate = $num;
        }
        if ($num === $candidate) {
            $count++;
        } else {
            $count--;
        }
    }
    
    // Step 2: 验证候选主元素
    $count = 0;
    foreach ($nums as $num) {
        if ($num === $candidate) {
            $count++;
        }
    }
    
    // 判断是否为主元素
    if ($count > count($nums) / 2) {
        return $candidate;
    }
    
    return null;
}

Python 示例代码:

def majorityElement(nums):
    candidate = None
    count = 0
    
    # Step 1: 找到候选主元素
    for num in nums:
        if count == 0:
            candidate = num
        if num == candidate:
            count += 1
        else:
            count -= 1
    
    # Step 2: 验证候选主元素
    count = sum(1 for num in nums if num == candidate)
    
    # 判断是否为主元素
    if count > len(nums) // 2:
        return candidate
    
    return None

JavaScript 示例代码:

function majorityElement(nums) {
    let candidate = null;
    let count = 0;
    
    // Step 1: 找到候选主元素
    for (let num of nums) {
        if (count === 0) {
            candidate = num;
        }
        if (num === candidate) {
            count++;
        } else {
            count--;
        }
    }
    
    // Step 2: 验证候选主元素
    count = 0;
    for (let num of nums) {
        if (num === candidate) {
            count++;
        }
    }
    
    // 判断是否为主元素
    if (count > nums.length / 2) {
        return candidate;
    }
    
    return null;
}

码小课网站中有更多相关内容分享给大家学习,涵盖各种算法和数据结构的深入解析与实战应用。

推荐面试题