查找最小缺失数的 PHP 程序
给定一个由 n 个不同整数组成的排序数组,其中每个整数的范围为 0 到 m-1 且 m > n。找到数组中缺少的最小数字。
例子
Input: {0, 1, 2, 6, 9}, n = 5, m = 10
Output: 3
Input: {4, 5, 10, 11}, n = 4, m = 12
Output: 0
Input: {0, 1, 2, 3}, n = 4, m = 5
Output: 4
Input: {0, 1, 2, 3, 4, 5, 6, 7, 10}, n = 9, m = 11
Output: 8
感谢 Ravichandra 提出以下两种方法。
方法一(使用二分查找)
对于 i = 0 到 m-1,对数组中的 i 进行二分搜索。如果数组中不存在 i,则返回 i。
时间复杂度:O(m log n)
方法2(线性搜索)
如果 arr[0] 不为 0,则返回 0。否则从索引 0 开始遍历输入数组,对于每对元素 a[i] 和 a[i+1],求它们之间的差。如果差值大于 1,则 a[i]+1 是缺失的数字。
时间复杂度:O(n)
方法 3(使用修改后的二进制搜索)
感谢 yasein 和Jams提出这种方法。
在标准的二分搜索过程中,将要搜索的元素与中间元素进行比较,并根据比较结果决定是结束搜索还是去左半边或右半边。
在这种方法中,我们修改了标准的二分搜索算法,将中间元素与其索引进行比较,并在此比较的基础上做出决策。
- 如果第一个元素与其索引不同,则返回第一个索引
- 否则得到中间索引说中间
- 如果 arr[mid] 大于 mid 则所需元素位于左半部分。
- 否则所需的元素位于右半部分。
PHP
$end)
return $end + 1;
if ($start != $array[$start])
return $start;
$mid = ($start + $end) / 2;
// Left half has all
// elements from 0 to mid
if ($array[$mid] == $mid)
return findFirstMissing($array,
$mid + 1,
$end);
return findFirstMissing($array,
$start,
$mid);
}
// Driver Code
$arr = array (0, 1, 2, 3, 4, 5, 6, 7, 10);
$n = count($arr);
echo "Smallest missing element is " ,
findFirstMissing($arr, 2, $n - 1);
// This code Contributed by Ajit.
?>
有关详细信息,请参阅有关查找最小缺失数字的完整文章!