算法题:找出不在数组中的最小的那个数字所遇到的问题
一切的源头
一切都源于一个题目:给定一个数组,找出不在数组中的最小的那个数字。这是原文链接。
同学问我,说这篇文章里的第5种解法,他实现了可是却得不到正确的结果,于是我去阅读了该文章,这篇文章的思路真的很巧妙,文章也写的很明白,然后我也去试着实现了第5种算法,过程中也遇到了很多问题,不过最后也都解决了,在这里做一下记录。
初次探索
首先要注意两点:
1. 数组的下标是从1开始的
2. 数组中没有重复的元素
先描述一下原文作者的思路:
首先取1~n的中间值m=(1+n)/2,然后利用快拍中的partition函数的思想将整个数组分成2部分。
A1中都是小于或等于m的数字,A2中都是大于m的数字。
如果A1的长度小于m,那么说明缺少的数字应该出现在A1中,否则在A2中,具体推导过程作者说的很详细,这里就不在赘述了。
以下是作者的代码:
MIN-AVAILABLE-NUM(A, low, up)
if(low == up) return low
m = (low + up) / 2
split = partition(A, low, up, m)
if a[split] == m
then return MIN-AVAILABLE-NUM(A, low, split)
else return MIN-AVAILABLE-NUM(A, split+1, up)
这个思路是没有问题的,但是都存在一点小问题,一会在讨论,因为当时我