面试常问的小算法总结

图的最短路径算法

Floyd最短路算法

http://blog.51cto.com/ahalei/1383613

核心代码:

for(k=1;k<=n;k++)
    for(i=1;i<=n;i++)
        for(j=1;j<=n;j++)
            if(e[i][j]>e[i][k]+e[k][j])
                 e[i][j]=e[i][k]+e[k][j];

Dijkstra最短路算法

http://blog.51cto.com/ahalei/1387799

//Dijkstra算法核心语句
    for(i=1;i<=n-1;i++)
    {
        //找到离1号顶点最近的顶点
        min=inf;
        for(j=1;j<=n;j++)
        {
            if(book[j]==0 && dis[j]<min)
            {
                min=dis[j];
                u=j;
            }
        }
        book[u]=1;
        for(v=1;v<=n;v++)
        {
            if(e[u][v]<inf)
            {
                if(dis[v]>dis[u]+e[u][v])
                    dis[v]=dis[u]+e[u][v];
            }
        }
    }

M:边的数量

N:节点数量

通过上面的代码我们可以看出,这个算法的时间复杂度是O(N2)。其中每次找到离1号顶点最近的顶点的时间复杂度是O(N),这里我们可以用“堆”(以后再说)来优化,使得这一部分的时间复杂度降低到O(logN)。另外对于边数M少于N2的稀疏图来说(我们把M远小于N2的图称为稀疏图,而M相对较大的图称为稠密图),我们可以用邻接表(这是个神马东西?不要着急,下周再仔细讲解)来代替邻接矩阵,使得整个时间复杂度优化到O( (M+N)logN )。请注意!在最坏的情况下M就是N2,这样的话MlogN要比N2还要大。但是大多数情况下并不会有那么多边,因此(M+N)logN要比N2小很多。

用邻接表代替邻接矩阵存储

http://blog.51cto.com/ahalei/1387799

可以发现使用邻接表来存储图的时间空间复杂度是O(M),遍历每一条边的时间复杂度是也是O(M)。如果一个图是稀疏图的话,M要远小于N2。因此稀疏图选用邻接表来存储要比邻接矩阵来存储要好很多。

汉诺塔

https://www.zhihu.com/question/24385418/answer/89435529

image.png

杨辉三角

https://blog.csdn.net/zmy_3/article/details/51173580

def triangles():
    N=[1]
    while True:
        yield N
        N.append(0)
        N=[N[i-1] + N[i] for i in range(len(N))]

n=0
for t in triangles():
    print(t)
    n=n+1
    if n == 10:
        break

回文数/回文串

return a == a[::-1]
# 字符串/数字
a = len(s)
i = 0
while i <= (a/2):
    if s[i] == s[a-1-i]:
        i += 1
    else:
        return False
return True

# 数字
def isPalindrome(x):
        if x < 0:
            return False
        temp = x 
        y = 0 
        while temp:
            print temp, y*10, temp%10
            y = y*10 + temp%10
            temp /= 10
        return x == y

斐波拉契数列(Fibonacci)

def fibonacci():  # 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89
    f = [0] * MAXSIZE
    f[0] = 1
    f[1] = 1
    for i in range(2, MAXSIZE):
        f[i] = f[i-1] + f[i-2]
    return f
fibs = [1,1]  
for i in range(8):
    fibs.append(fibs[-2] + fibs[-1])

最大子序列与最大子矩阵问题

数组的最大子序列问题

给定一个数组,其中元素有正,也有负,找出其中一个连续子序列,使和最大。

https://blog.csdn.net/qqxx6661/article/details/78167981

最大子矩阵问题

给定一个矩阵(二维数组),其中数据有大有小,请找一个子矩阵,使得子矩阵的和最大,并输出这个和。

https://blog.csdn.net/kavu1/article/details/50547401

原始矩阵可以是二维的。假设原始矩阵是一个3 * n 的矩阵,那么它的子矩阵可以是 1 * k, 2 * k, 3 * k,(1 <= k <= n)。 如果是1*K,这里有3种情况:子矩阵在第一行,子矩阵在第二行,子矩阵在第三行。如果是 2 * k,这里有两种情况,子矩阵在第一、二行,子矩阵在第二、三行。如果是3 * k,只有一种情况。

为了能够找出最大的子矩阵,我们需要考虑所有的情况。假设这个子矩阵是 2 * k, 也就是说它只有两行,要找出最大子矩阵,我们要从左到右不断的遍历才能找出在这种情况下的最大子矩阵。如果我们把这两行上下相加,情况就和求“最大子段和问题” 又是一样的了。

KMP算法

https://blog.csdn.net/qqxx6661/article/details/79583707

LCS/最长公共子序列/最长公共子串

https://blog.csdn.net/qqxx6661/article/details/79587392

猜你喜欢

转载自blog.csdn.net/qqxx6661/article/details/80501216
今日推荐