总结
解法:Hash、双指针、快慢指针、栈、二分法、动态规划、分治法。
注意事项:Java 基础(int 范围,int 数组默认值,值传递中链表的使用),返回值 or 下标,原数据是否重复,解是否唯一,是否要求有序。
小Tips:对称、回文往往只需要计算一半,或通过奇偶性快速返回;
1. 两数之和 【Easy】
关键思路:使用 Hash 快速寻找补数,将时间复杂度从两次枚举的 O(n^2) 降至 O(n) 。
扩展:Hash 非常适用于二元互补场景。(由于题目需要返回的是下标而非值,用题15的双指针反而会降低性能,因为排序会打乱坐标,需要额外的开销来记录并最终返回下标)
7. 整数反转 【Easy】
关键思路:通过循环,将原数据从右到左进行计算即可。(容易想到转为字符串再反转,但其会造成额外的字符串处理开销)
扩展:此题其实也考察到基础知识,再次可稍做复习,如 Java 中 int 大小为[-2^31, 2^31-1],超过会变成-2^31-1。以及 Integer 的缓存区[-128,127]。
9. 回文数 【Easy】
关键思路:通过计算其反转方式实现,且计算到一半即可,最后根据位数的奇偶情况进行判断。
13. 罗马数字转整数 【Easy】
关键思路:可将 IV 这类数字看做一个整体来计算,如 switch 里写死,或者提前 String.replace() 替换掉;也可将 IV 看做减法,即每次比较当前数与后一数,大于做加法小于做减法。但时间复杂度都是 O(n) ,区别仅在语言基础层面。
14. 最长公共前缀 【Easy】
关键思路:纵向比较,注意这里两层枚举和通常的先枚举元素不同,所以可先提取第一个元素来进行比较。其他方式如分治法,将 f(X1,X2,X3) 转为 f(f(X1,X2),X3) 等。
15. 三数之和 【Medium】
关键思路:排序+双指针,巧妙将时间复杂度从三次枚举的 O(n^3) 降至 O(n^2) 。
扩展:双指针适合用枚举2个元素时,一个递增,一个递减的场景。(由于题目中数字可重复、解不唯一,用题1的 Hash 法反而会降低性能,例如通过 List.contains() 来去重)
19. 删除链表的倒数第N个结点 【Medium】
关键思路:快慢指针,快指针先移动N个结点,然后快慢指针同步移动,当快指针到达链表末尾时慢指针即到达倒数N个结点。当然,也可以先遍历一次统计链表长度,再删去正数结点即可。
20. 有效的括号 【Easy】
关键思路:栈,同时由于对称性当原字符串长度为奇数时可直接返回 false 。其他调整包括用 ASCII 码来判断符号,或用 String.replace() 来操作,想法不错但并非最优解。
21. 合并两个有序链表 【Easy】
关键思路:定义好一个根结点,判断并指向当前两个链表表头更小的,而后更小的链表往后移动。(这里考察基础,Java 中为值传递,对象间 = 符号传递地址,即如果使用 User user2 = user1 这样的写法,后续将同时修改到两个 User 对象,除非成员变量使用 final 修饰)
26. 删除排序数组中的重复项 【Easy】(关键思路:按照题目要求维护好两个指针即可)
27. 移除元素【Easy】
关键思路:相较于题26更为复杂,但本质上依然是维护双指针,并且题目中的“常数级空间复杂度”、“不考虑顺序”也提示到这一点。
28. 实现strStr()【Easy】
关键思路:类似于题14的寻找最长公共前缀,处理好双指针,注意回溯。(还可以采用Hash法,设定一个Hash函数,计算滑动窗口的Hash值是否等于字串)
35. 搜索插入位置【Easy】(关键思路:直接枚举或采用二分法)
38. 外观数列【Easy】(过于简单,跳过讲解)
53. 最大子序和【Easy】
关键思路:暴力枚举 O(n^2)、动态规划 O(n)、分治法 O(n)。假设数组为 a1 a2 …… an , 连续子数组的最大和为 f(n),f(n) = Max( f(n - 1) + an , an) ,用一个数组 dp 来维护 f(1) f(2) …… f(n),最终取最大值,这样写可读性高,一目了然 DP;但可将空间复杂度进一步优化至 O(1),即用pre来表示 f(n - 1)。
58. 最后一个单词的长度【Easy】(按照题意倒叙枚举即可,主要是语言细节层面调优代码)
66. 加一【Easy】(按照题意倒叙枚举即可,注意 Java int 数组默认值都是 0,可针对此快速返回)
67. 二进制求和【Easy】(与66类似,可直接相加,或采用位运算)
83. 删除排序链表中的重复元素【Easy】(按题意删除结点即可,注意链表的各类操作)
146. LRU缓存机制 【Medium】
关键思路:HashMap + 双向链表,来实现常数级别的 get set,以及LRU机制。
237. 删除链表中的结点【Easy】(直接删除当前结点即可,可归纳删当前和删下一个的区别)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)