返回

PHP Leetcode题解--D79 448. Find All Numbers Disappeared in an Array:揭开缺失数字的奥秘

见解分享

算法剖析

1. 遍历法

1.1 原理介绍

遍历法是一种简单而直接的方法,它通过循环遍历数组中的每个元素,并将其标记为已访问。然后,再进行第二次遍历,查找未被标记的元素,这些元素就是缺失的数字。

1.2 代码实现
<?php

function findDisappearedNumbers($nums) {
    $n = count($nums);
    $visited = array_fill(0, $n, false);

    foreach ($nums as $num) {
        $visited[$num - 1] = true;
    }

    $result = array();
    for ($i = 0; $i < $n; $i++) {
        if (!$visited[$i]) {
            $result[] = $i + 1;
        }
    }

    return $result;
}
?>

2. 散列表法

2.1 原理介绍

散列表法是一种更有效的方法,它使用一个散列表来存储数组中的元素。当遍历数组时,将每个元素作为散列表的键,并将该元素的值设置为1。然后,再遍历散列表,查找键为1的元素,这些元素就是缺失的数字。

2.2 代码实现
<?php

function findDisappearedNumbers($nums) {
    $hashtable = array();

    foreach ($nums as $num) {
        $hashtable[$num] = 1;
    }

    $n = count($nums);
    $result = array();
    for ($i = 1; $i <= $n; $i++) {
        if (!isset($hashtable[$i])) {
            $result[] = $i;
        }
    }

    return $result;
}
?>

3. 排序法

3.1 原理介绍

排序法是一种更为简洁的方法,它先对数组进行排序,然后遍历数组,查找相邻元素之间的缺失数字。

3.2 代码实现
<?php

function findDisappearedNumbers($nums) {
    sort($nums);

    $n = count($nums);
    $result = array();
    for ($i = 1; $i <= $n; $i++) {
        if ($i != $nums[$i - 1]) {
            $result[] = $i;
        }
    }

    return $result;
}
?>

4. 计数法

4.1 原理介绍

计数法是一种更为高效的方法,它利用数组中元素的范围来进行计数。首先,创建一个大小为n的数组,并将其全部元素初始化为0。然后,遍历原数组,将每个元素作为计数数组的索引,并将其值加1。最后,遍历计数数组,查找值为0的索引,这些索引就是缺失的数字。

4.2 代码实现
<?php

function findDisappearedNumbers($nums) {
    $n = count($nums);
    $count = array_fill(0, $n, 0);

    foreach ($nums as $num) {
        $count[$num - 1]++;
    }

    $result = array();
    for ($i = 0; $i < $n; $i++) {
        if ($count[$i] == 0) {
            $result[] = $i + 1;
        }
    }

    return $result;
}
?>

结语

在本文中,我们详细介绍了四种查找数组中缺失数字的方法,包括遍历法、散列表法、排序法和计数法。每种方法都有其独特的优缺点,您可以根据具体情况选择最适合您的方法。希望这些方法能够帮助您解决实际问题,并提升您的编程技能。