查找搜索:
树型:DFS或BFS(不够+状态存储,缩短时间)(如数位DP,就是DFS+状态存储) 【其他:B树,B+树】
链表:多用two pointer
例子: https://leetcode.com/problems/substring-with-concatenation-of-all-words/
无序数组:hash映射(O(1),map,set等) 【其他:并查集,字典树tire】
例子: https://leetcode.com/problems/substring-with-concatenation-of-all-words/
有序数组:二分查找
例子:
https://leetcode.com/problems/search-insert-position/
https://leetcode.com/problems/search-for-a-range/
https://leetcode.com/problems/search-in-rotated-sorted-array/
【其他:棋牌类游戏博弈树:极大极小值算法,alpha-beta剪枝】
排序:
桶排序:O(n)
归并排序:常用于链表排序,O(nlogn)。每次遍历那个节点,交换的时间复杂度O(1),遍历logn次
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------
查找
1.二分思想
理解:其主要目的是将整段数丢掉一半来处理。用于加速运算,减少计算量
分类:
a.将二分的思想应用于查找(二分查找)
对于有序数组而言:使用(s+e)/2的方法拿到基准,丢掉大于(或小于)基准的那部分。
例子:
367.https://leetcode.com/problems/valid-perfect-square/
对于无序数组而言:使用partition的方法拿到基准,丢掉大于(或小于)基准的那部分。
b.将二分的思想应用于其他
二分思想应用于其他也是为了将处理的整段数据丢掉一半来处理。想要使用二分的方法减少计算量,这时候分成的两部分数据必须是相同或者至少可以通过部分A的简单运算就可以得到部分B,不然分成两部分计算的方法没有减少计算量的帮助。
例如50.Pow(x, n):http://blog.csdn.net/chinajane163/article/details/53502042,就因为均等划分成n/2和n-n/2后,两部分或相等,或可通过乘x来转化,所以此题才可用二分的方法来提速。
例子:
50.https://leetcode.com/problems/powx-n/
2.两指针
理解:两个指针因同一个条件变化,都能移动的才叫两指针。
这种不叫两指针,指针i,j不是联动的。二分查找某种意义上来说也是两指针。可用于string、array、list等操作for(int i=0;int i<size;++i) for(int j...)
分类:
a.首、尾两指针,两个指针往中间走
从首尾向中间走的一般array,string,list。值都具有一定的顺序性
例子:
15. https://leetcode.com/problems/3sum/
167.https://leetcode.com/problems/two-sum-ii-input-array-is-sorted/
b.首、首两指针,两个指针往尾走
例子:
3.https://leetcode.com/problems/longest-substring-without-repeating-characters/
3.堆heap
理解:大顶堆,小顶堆常用语输出前k个元素。
阿斯顿