阿里机器学习面经:
对于题一:
思路①:建立一个1-100的哈希表,遍历数组,同时从哈希表中弹出相应值。最终哈希表中剩下的就是数组中缺失的。时间复杂度o(n),空间复杂度o(n)
思路②:排序,然后看哪两个不相邻(或者看哪个元素与其下标不对应)。时间复杂度o(nlogn),空间复杂度o(1)
思路③:类似于《找数组中重复的数字》一题修改数组的做法。遍历数组,对于下标为i的元素,判断其值与下标是否相等,若不等则替换到与其值相等的下标中去。注意:由于缺失一个元素,因此若遍历到100,则在放置时会溢出,那我们就并不真正放置。此时由于没有元素交换回来,因此该下标一定为空,我们就用一个值来记录当前为空的下标。若是后面有值填充过来,我们就更新空下标。直到遍历完成,最终的空下标值就是缺失的元素。若全程没有空下标,则证明缺失的值是100。时间复杂度o(n),空间复杂度o(1)
思路④:类似于《找数组中重复的数字》一题不修改数组的做法,用二分的思想逐渐定位缺失区间在哪。首先将区间分为(1,50]和(50,100],遍历数组看落在一区间的有多少个数,如果数刚好是区间长度,证明该段数据不缺失,那么另一段区间必缺失。按此思路二分下去,最终将缺失区间缩减,直至定位出缺失的值。时间复杂度o(nlogn),空间复杂度o(1)
思路⑤:直接遍历数组求和,然后用1+2+…+100值减去数组之和。emmmm。
对于题二:
关键:从缺失的值开始元素与下标一定不等了。
思路①:遍历看谁的值与下标不等。时间复杂度o(n),空间复杂度o(1)
思路②:二分查找。若mid满足相等,则缺失值必然位于后一区间,否则前一区间。时间复杂度o(logn),空间复杂度o(1)
思考:
通用算法一定不是最优解,因为对于各种环境都适用,所以用了以后一定会包含除了题目要求的额外的信息,这必然会需要更高的复杂度。所以要针对特定问题做优化,找到一个专门适用该题目的解法。
比如该题如果用哈希表,那么你会发现数组即使不是1-100也适用,元素就算丢失多个也适用。所以一定不是这个题目的最优解法。要充分利用题目的已知信息:1-100且丢失一个----->想到思路⑤
————————————————————————————————————————————
一些扩展:
找出出现奇数次的值。