448. Find All Numbers Disappeared in an Array
Easy题。看答案看到一种很聪明的做法:
for e in nums:
nums[abs(e) - 1] = -abs(nums[abs(e) - 1])
return [i + 1 for i, e in enumerate(nums) if e > 0]
第二轮运气比较好,遇到一个中国人大哥,大哥直接让我讲中文了。也不废话啰嗦,上来直接就出题。题目是给定一个list of interger,找出其中surpassers的总数。surpasser的定义是对于i,j if i < j and A[i]<A[j], then j is a surpasser of i. 也就是一个pair,后面的数index和值都比前一个大。这个题目brute force的方法很好想,就是一个二重循环,复杂度n方。大哥开始问如何优化,说最优解是nlogn。我想半天没想出来,要大哥提醒。大哥说有两种方法,一种是二叉树插入,还有一种是merge sort的变体。大哥提醒我了之后我还是没想明白,只能再次求教。后来总算明白了merge sort的方法,其实就是分治,分成left right,两边count,再count横跨两边的pair,最后把三个数加起来。知道了算法我就开始写,写的还挺快的,但是中间又出了问题:count横跨两边的pair的时候,我用了一个二层循环,这样一来就不是nlogn了,大哥让我算一下复杂度,我算出来是n方。那么怎么才能nlogn呢?我又卡壳了。在大哥提醒下,我在divide and conquer的时候,一边count 一边排序,这样上层拿到的就是一个有序list,就可以用O(n)的时间计算pair,这样复杂度就nlogn了。大哥开始问我空间复杂度的问题,我说是nlogn。最后大哥说最优的merge sort可以只用O(n)的空间。面试结束。感觉这题比上一题要更难一些,两次思路都没想到,感觉不太妙。
127. Word Ladder 难度medium
一开始超时。后来利用字符串的字母个数限制,将一个维度的复杂度降低到常数级才通过。
for i in xrange(len(w1)):
for cha in 'abcdefghijklmnopqrstuvwxyz':
。。。
这个循环大概有上百次,但毕竟还是常数级。再大的常数级都比O(N)要好。这是一个真理。