Category Archives: 算法&数据结构

求子数组之和的最大值

编程之美上的一道题,今天在别的地方看别人用贪心写的,真心觉得不对,所以做了一下。

一个有N个元素的一维数组(a[0], a[1]....a[n-1]),我们定义连续的a[i] ~ a[j],0<= i, j <=n-1为子数组。

显然这个数组中包含很多子数组,请求最大的子数组之和。

如果不想时间复杂度,用遍历所有可能子数组,然后找出最大值就可以了。

现在如果要求时间复杂度最小,那么肯定是要DP解的。

我们假设定义两个数组:

all[i]:表示从i~[......]

继续阅读

带min和max辅助函数的栈

设计一个特殊的栈,包含 min 函数。能够得到栈的最小元素。

要求函数 min、push 以及 pop 的时间复杂度都是 O(1)。

分析

由于时间复杂度的要求,我们不能用其他方法了,最简单的就是用空间换时间,给每个元素加一个min元素,表示压栈到现在最小的元素。

这样每次push时候,维护下data[top-1].min和当前val,取min值设到data[top].min即可。注意top=0时的特殊情况,min就是val。

特别提醒:企图整个栈共用一个min或者[......]

继续阅读

数据结构重读 – 二叉树

1、二叉树(Binary Tree)是一种特殊的树形结构:每个结点至多有两棵子树,即二叉树中不存在度大于2的结点。

2、二叉树的子树有左右之分,次序不能任意颠倒。

3、性质1:二叉树的第i层上至多有2^(i-1)个结点,i从1下标开始。所有

4、性质2:深度为k的二叉树至多有2^k -1个结点,k也是从1下标开始。

5、性质3:对于任何一棵二叉树,如果终端结点数为n0,度为2的结点数为n2,则n0 = n2+1。这个很简单:

(1)设度为1的结点数为n1,则总结点数[......]

继续阅读

数据结构重读 – 树的定义和基本术语

1、树是n(n>=0)个结点的有限集合。树中有且仅有一个结点为根(Root)。

2、当定义1中的n>1时,其余结点可以分为m个互不相交的有限集合T1、T2。。。每一个子集都是一颗树,并且是根的子树。

3、树中结点的:结点拥有子树的个数(分叉数)称为结点的度(Degree)

4、度为0的结点称为叶子(Leaf)结点。度非0的结点是分支结点或非终端结点。

5、公式:树中结点的数量 = 所有结点的度之和 + 1

6、结点的子树的根称为该结点的孩子。该结点[......]

继续阅读

数据结构重读 - 矩阵乘法

矩阵乘法最naive的版本,自己数学弱爆了,矩阵乘法已经不知道怎么算了……

先科普下吧。

3   0   0   5
(A) 0  -1   0   0
2   0   0   0

0   2
(B)  1   0
-2  4
0   0

首先乘出来的结果是,新矩阵的行是A的行,新矩阵的列是B的列。

计算方法是,首先A的第1行点乘(每个位置上分别乘)B第1列的元素,做为结果矩阵(1, 1)上的元素。然后A的第1行点乘第2列,做为结果矩阵(1, 2[......]

继续阅读