做了Algorithm分类下的前30题。感觉题目还比较适合我,难度的分类也挺准确的,easy的大部分10分钟之内能pass,medium的时间会长一些,hard的题目可能要想得更久一些。
前30题里面印象比较深刻的有几道题,做得很费劲。
一个是前面提到的两个数组中位数的问题。其实想到解法就简单了,但我一开始没有想清楚。还是对这个问题的本质没把握好,不然应该想到能从相同长度的数组推广到两个不同长度的数组的方法。
第10题,正则表达式匹配,花了我好长好长的时间。一方面是一开始对如何回溯没想太清楚,后来才想到应该直接回溯到星号的地方就可以了。另外这题目确实各种边界条件太多,提交了好多次才成功。这要是面试里要求写个bug free的代码,那我肯定挂了。
还有3sum和4sum的问题。2sum是很简单的,但是3sum我一开始觉得应该能有比O(n2)更快的算法,但想了很久也没想出来。最后才知道原来这个问题的下限就是O(n2)。还有就是排序后首尾两个指针,相加的和大于target则尾部指针向前移动,小于target则头部指针向后移动。这个方法有点违反我的直觉,总觉得会漏掉一些解。但其实想明白了就发现就是这么回事。
4sum就相当于两个2sum。但如何去重是很麻烦的。最后直接用HashSet来去重了。
后面几道链表指针的题目都不难。多个Sorted List归并要用到最小堆,一开始想自己写个实现,后来偷懒还是直接用jdk自带的PriorityQueue了。最后比较困扰我的的是生成括号这道题,其实思路很简单,但现在要我不用递归写个回溯感觉很费劲。不像七八年前的状态,全排列我都写不出来了。最后参考了一下递归的写法,简单又清晰。还是递归好哇。