最近无聊,刷了一批Leetcode水题,用简要题解记录一下做题过程,也小小帮助一下被坑所困的人。
1~10
-
- O(n2):暴力枚举
- O(nlogn):排序+two-pointers或者map/set大法好
- O(n):哈希表
-
O(n),边处理边进位,注意最后一位进位和链表为空的边界情况
Longest Substring Without Repeating Characters
- O(nlogn),滑动窗口,用一个set维护当前的字符集,如果新加入的字符以前出现过,抛弃左边重复的字符,所有字符有且仅有被遍历一遍
- O(n),把set换为哈希表
-
O(log(min(m,n)),特判数组大小为(0,*)(1,*)(2,*)的情况,二分查找,注意奇怪的边界情况
-
O(n),强上manacher算法
-
手动模拟一下“ZIGZAG”的样子,模拟过程
-
按位取出,重新分配,注意溢出问题
-
按位取出,重新分配,注意符号和溢出问题
-
O(n),从两边向中间判断
-
O(mn),DP,按下一个是否为’*’分类讨论
11~20
-
O(n),two pointers,移动高度较小的指针,使结果尽量大。
-
模拟题,按照罗马数字的规则追加相应的字符串。
-
模拟题,按照罗马数字的规则加上相应的数字。
-
模拟题,按照长度排序,然后搜索最短的字符串最大能匹配到所有的字符串的第多少个字符。
-
O(n2),two pointers,枚举一个数,然后在后面的序列寻找满足的两个数,注意去重。
-
与3Sum相同, 只是记录的时候判断并记录距离最小的值。
Letter Combinations of a Phone Number
模拟题,每次循环往上次生成的序列中的每个元素尾部追加相应字符。
-
与3Sum相同,只是需要枚举两个值。
Remove Nth Node From End of List
简单的链表操作,注意删除首节点的情况。
-
使用一个栈维护一下之前的左括号,按照右括号判断,若无对应的左括号则无法匹配。
21-30
to be continued…