前几天听同事分享了一道今日头条的算法面试题,感觉非常有趣,今天也分享给大家,题目是这样的:
给定一个有序数组,数组中有正数、负数或者0,对数组中所有的数求平方后问有多少个不同的值。
比如对于数组[-1,0,1,1,1,1],对数组求平方后为[1,0,1,1,1,1],那么最终的结果是2,因为最后只有0和1两个不同的数;
对于数组[-1,0,1,2,3],对数组求平方后为[1,0,1,4,9],那么最终的结果是4,因为最后数组中为0,1,4,9这四个不同的数;
同事提到只有时间复杂度为O(n),空间复杂度为O(1)的算法才能通过面试,在听到这个题目后首先想的就是如果在面试中自己遇到这个题目该如何解决?
我是如何思考的
如果在面试中遇到这个题目我会先给出一个最简单的解法,也就是直接对数组中的每一个数字求平方,然后放到map中,最后求一下map的大小就可以了,整个过程如图所示:
实际上这种解法有个问题,那就是对数字求平方和容易导致溢出,而实际上我们根本就无需求平方,实际上只需要求出绝对值就可以了,只要两个数字的绝对值相等,那么这两个数字的平方也一定相等。因此我们只需要将上图中的第一步由求平方改为求绝对值就可以了。