数据结构
算法
字符串
牢牢记住经典算法题,早日放弃记不住的Hard \ 工科的东西只能勤加练习,没有任何办法,即使我分析的再透彻,还是极其容易忘记,和语言也一样,所以没有捷径,只有练习!
子串问题
if(hashMap.containsKey(c)){
left = Math.max(hashMap.get(c)+1,left);
}
hashMap.put(c,i);
max = Math.max(max,i-left+1);
不知道为什么忘记的特别快,因此可以考虑结合一个很好理解的例子,abbcaa
map {a:0,b:1},然后到第二个b的时候,left = Max(1+1,0) = 2, maxLen = 2 也就是从index 2 开始新一个子串
{a:0,b:2,c:3} 此时left = max(1,2) = 2,这就是关键,因为之前的存储的a的index已经位于left左边了,所以此时left不用变,但是下一个a,就不再小于left了
假设当前字符串重复的位置小于left,left就不变;假设当前的重复字符位于left或者left的右边,left就必须从重复的字符的下一个开始!这样就更好理解了
解题核心:left代表子串起始位置,每次比较当前遍历字符在哈希表中的index+1和left
图
浩瀚无穷的题目,必须找出所有企业的最大公约数,并且找出每一个知识点问到的程度到底有多深,最经典的就是KMP和Dijkstra,就是无论怎么学,都无法快速的手写出来。
因此我们必须牢牢抓住我们可以掌握的,避免因小失大,过分注重难题,忽略了大量的中等题,比如接雨水其实就是很好掌握的,很多题目只需要理解一个点之后就可以迅速理解。
图就只考BFS和DFS,其实仔细思考,面试一个小时,也无法出很难的题目让你快速解决的。
因此牢牢抓住这两个即可
BFS and DFS
额外替补
并查集 最小生成树算法原理及其应用,Prim, Kruskal Dijkstra算法原理及其应用 拓扑排序