稀有猿诉

十年磨一剑,历炼出锋芒,说话千百句,不如码二行。

BFS and DFS Made Easy

广度优先搜索和深度优先搜索在二维数据结构中(树,图和矩阵)有着非常重要和广泛的应用,今天就来好好的学习,理解和总结一下这两种遍历方法。

双指针总结

双指针是指用两个引用或者索引,或者某种键为主的操作手段,在很多场景有重要的应用,比如链表。有些时候还能成为比较巧妙的解题手段。今天就来总结一下双指针的使用。

Binary Search Made Easy

二分查找 Binary Search是效率特别高的一种算法,它能将线性复杂度O(n)降低到对数级别O(logn)。但它对输入数据有要求,比如对于数组来说必须是排序的,否则是不能应用二分的。今天就来理解一下二分查找,然后总结常见的题目和注意事项。

线段树让你不再惧怕区间问题

线段树是用于求解序列区间问题的高效的数组结构,它是以完全二叉树形式来把序列划分为不同的区间,进而把O(n)复杂度提升到O(logn)。

线段树与树状数组有些类似,都可以用于解决区间问题,但线段树更具体普适性,树状数组能解决的问题线段树都可以解决,但反之不然。树状数组的学习可以参考另外一篇文章

编码常见技巧总结

在日常编码中有一些非常常用,但却很细节的小技巧,虽然有朴素的实现的方式,但如果能掌握一些高级技巧不但性能会更好,并且因为技巧比较流行,也不会影响可读性。最简单的例子就是除2和乘2,当然可以直接用乘法和除法,但如果用移位效果更好,也并不影响可读性,因为这是比较流行的做法。

这里就将总结一些常用的小技巧,以供日后查阅。

表达式求值问题总结

在模拟范畴内表达式运算求值是比较典型的一类问题,而且是较难的一类题,细节非常多,数组结构一般只用到栈,需要积累一定的技巧以简化逻辑。

秘密武器之单调栈

除了在树的遍历,DFS等常规场景使用栈(Stack)以外,针对某些特定的问题,还能以栈为主要手段进行非常巧妙的解题,栈中数据(通常是整数)的存储以单调递增或者单调递减的形式,新的元素入栈前通常要把小于它的或者大于它的元素出栈,习惯称之为单调栈

问题的常规解的时间复杂度通常会达到O(n2)或者O(nlogn),但使用单调栈可以达到O(n),思路非常的巧妙。

MarkDown之数学公式

有时候文档里面会涉及一些数学公式,用常规的格式都难以得到满意的效果。

数学公式方面Latex是最为专业的,Markdown也是支持Latex的。

Java集合操作集锦

集合是最为常见的容器,在日常工作之中经常用到,一些集合的常规操作以及不同的集合之间的转换,虽然看似是基础中的基础,但实践中会发现并不是那么显而易见的,特别是涉及boxing的时候,这篇就是想总结 出一些最优的方式来进行集合操作和转换。

注意:这里集合的意思是容器,是一个更为宽泛的概念,包括数组,列表,Map,Set等。