leetcode中常用的算法简介

1.binary search

二分法检索(binary search)又称折半检索,二分法检索的基本思想是设字典中的元素从小到大有序地存放在数组(array)中,首先将给定值key与字典中间位置上元素的关键码(key)比较,如果相等,则检索成功;否则,若key小,则在字典前半部分中继续进行二分法检索;若key大,则在字典后半部分中继续进行二分法检索。这样,经过一次比较就缩小一半的检索区间,如此进行下去,直到检索成功或检索失败。偶数个取中间2个其中任何一个作为中间元素,二分法检索是一种效率较高的检索方法,要求字典在顺序表中按关键码排序。

2.two pointers

两个指针法。two pointers指的是一类题,而不一定是真正的two pointers, 比如可能是three pointers, 也可能不是pointer, 而是index。这类题基本上就是发生在array, string, linked list这三种数据结构上,是一种基本的算法和编程技巧,同样超高频率的出现,可以说是面试必遇的题。two pointers常常和其他的算法混杂起来出现。比如binary search本身也可以归类为two pointers的。如果这样算的话,Leetcode上边1/4的题目都跟它相关。因此,two pointers是必须熟练掌握的基本编程技巧。

Two pointers大概分三种类型

(1). 两个pointers从头往后走:感觉绝大多数的linked list的题目都涉及到这个操作,当然还有array。这类题目很多时候又可以称为sliding window。

●Implement strStr() 
●Longest Substring Without Repeating Characters 
●Minimum Window Substring 
●Remove Duplicates from Sorted Array & II 
●Remove Duplicates from Sorted List & II 
●Remove Element 
●Remove Nth Node From End of List 
●Reverse Linked Llist II 
●Rotate List 
●Substring with Concatenation of All Words 
●Swap Nodes in Pairs 

(2). 两个pointers从两头往中间走:一般面试出现的的都是singly linked list, 因此这类题主要是array题。

●3Sum 
●3Sum Closest 
●4Sum 
●Container With Most Water 
●Sort Colors 
●Trapping Rain Water 
●Two Sum 
●Binary search (will discuss it in a separate section) 

(3). 两个pointers控制两个不同的数组或链表:一般出现在跟merge相关的题目上。

●Add Binary 
●Add Two Numbers 
●Merge Sorted Array 
●Merge Two Sorted Lists 
●Multiply Strings 
●Partition List

3.DFS和BFS

 广度优先搜索(Breadth-First-Search)和深度优先搜索(Deep-First-Search)是搜索策略中最经常用到的两种方法,特别常用于图的搜索.其中有很多的算法都用到了这两种思想,比如:Dijkstra单源最短路径算法和Prim最小生成树算法都采用了和宽度优先搜索类似的思想。

(1).BFS的思想:
从一个图的某一个顶点V0出发,首先访问和V0相邻的且未被访问过的顶点V1、V2、……Vn,然后依次访问与V1、V2……Vn相邻且未被访问的顶点。如此继续,找到所要找的顶点或者遍历完整个图。
由此可以看出,用BFS进行搜索所搜索的顶点都是按深度进行扩展的,先找到到V0距离为1的所有顶点,然后找到距离V0为2的顶点……所以BFS所搜索到的都是最短的路径。

(2).DFS的思想:

顾名思义,深度优先搜索所遵循的策略就是尽可能“深”的在图中进行搜索,对于图中某一个顶点V,如果它还有相邻的顶点(在有向图中就是还有以V为起点的边)且未被访问,则访问此顶点。如果找不到,则返回到上一个顶点。这一过程一直进行直到所有的顶点都被访问为止。 DFS可以搜索出从某一个顶点到另外的一个顶点的所有路径。 由于要进行返回的操作,我们采用的是递归的方法。

详见:http://blog.csdn.net/yousheng324/article/details/6767726

4.Recursion

递归算法

详见:http://blog.csdn.net/lixiaoshan_18899/article/details/1227122

5.DP


6.merge

归并算法,如将有序的SR[i..m]和SR[m+1..n]归并为有序的TR[i..n]

7.KMP

kmp算法是一种改进的字符串匹配算法,由D.E.Knuth与V.R.Pratt和J.H.Morris同时发现,因此人们称它为克努特——莫里斯——普拉特操作(简称KMP算法)。KMP算法的关键是根据给定的模式串W1,m,定义一个next函数。next函数包含了模式串本身局部匹配的信息。

你可能感兴趣的:(每日练习)