目录
1、队列/栈重点题目
2、前缀和重点题目
3、回溯算法的重点题目
1、队列/栈重点题目
225.用队列实现栈
232.用栈实现队列
注:在存储时牺牲一些时间或空间比在每次操作时牺牲时间和空间要好得多!
所有这两题的重点时如何按一定顺序存储数据。
2、前缀和重点题目
303.区域和检索-数组不可变
如果直接在sumRange里面每次都使用for循环,那么时间复杂度为O(N)效率很低。
核心思路:new一个新的数组preSum出来,preSum[i]记录nums[0...i-1]的累加和。
560.和为K的子数数组:前缀和+HashMap
利用前缀和+HashMap可以进一步降低时间复杂度:
不管插入还是查找,由key获取hash值然后定位到桶的时间复杂度都是O(1),那么真正决定时间复杂度的实际上是桶里面链表/红黑树的情况。如果桶里面没有元素,那么直接将元素插入/或者直接返回未查找到,时间复杂度就是O(1),如果里面有元素,那么就沿着链表进行遍历,时间复杂度就是O(n),链表越短时间复杂度越低,如果是红黑树的话那就是O(logn)
所以平均复杂度很难说,只能说在最优的情况下是O(1)
3、回溯算法的重点题目
22.括号的生成
语言技巧:String StringBuffer StringBuilder的区别(来自菜鸟教程)
String 是不可变的对象, 因此在每次对 String 类型进行改变的时候,都会生成一个新的 String 对象,然后将指针指向新的 String 对象,所以经常改变内容的字符串最好不要用 String ,因为每次生成对象都会对系统性能产生影响,特别当内存中无引用对象多了以后, JVM 的 GC 就会开始工作,性能就会降低。
(1)基本原则:如果要操作少量的数据,用String ;单线程操作大量数据,用StringBuilder ;多线程操作大量数据,用StringBuffer。
(2)不要使用String类的"+"来进行频繁的拼接,因为那样的性能极差的,应该使用StringBuffer或StringBuilder类,这在Java的优化上是一条比较重要的原则。
Java程序设计总是采用按值调用。也就是说,方法得到的是所有参数值的一个副本。所以,一个方法不能修改基本数据类型。
而将对象引用作为参数就不同了,这个过程依然是按值调用,只是副本与对象指向同一个对象所以可以改变对象的参数状态。
可以将这道题类比于八皇后问题——回溯
考虑在每个位置上放 ' ( ' ' ) '是否被允许,如果允许则递进到下一个位置,如果不可以回溯。