MS100 [002-010]

MS100 [002]

设计包含min 函数的栈

定义栈的数据结构,要求添加一个min 函数,能够得到栈的最小元素。

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

思路:关键在于pop时能正确得到min为栈中剩下元素的最小值。所以定义栈中的元素为

struct MinStackElement {
  int data;
  int min;//保存以当前元素为栈顶时,栈中最小元素的值
};

MS100 [003]

最大子段和问题(Maximum Interval Sum)

思路:经典动态规划:

令b[i] = max{ b[i-1]+a[i], a[i] },   1<=i<=n

则max{ b[i] }即为所求。

MS100 [004]

在二元树中找出和为某一值的所有路径

在二元树中找出和为某一值的所有路径
题目:输入一个整数和一棵二元树。
从树的根结点开始往下访问一直到叶结点所经过的所有结点形成一条路径。
打印出和与输入整数相等的所有路径。

思路:由于只需要打印路径,所以可用一个数组Array[MAXLEN]保存路径,每次递归时都在Array数组中修改当前位置的值,在叶节点时,若相等则打印Array数组的值。

MS100 [005]

查找最小的k 个元素

题目:输入n 个整数,输出其中最小的k 个。
例如输入1,2,3,4,5,6,7 和8 这8 个数字,则最小的4 个数字为1,2,3 和4。

思路:建一个k个元素的最大堆,每次来一个元素,若比堆顶元素大,则替换之,然后重新整理成最大堆。O(nlogn)

MS100 [007]

判断俩个链表是否相交

给出俩个单向链表的头指针,比如h1,h2,判断这俩个链表是否相交。

思路:首先假定链表不带环。那么,我们只要判断俩个链表的尾指针是否相等。
如果链表带环,那判断一链表上俩指针相遇的那个节点,在不在另一条链表上。用两个指针,一个指针步长为1,一个指针步长为2,判断链表是否有环。

MS100 [009] 

判断整数序列是不是二元查找树的后序遍历结果

思路:以子段的最后一个元素为根,向前遍历,比它小的元素全在左边,比它大的元素全在右边。递归即可。(没考虑相等的情况)

MS100 [010]

翻转句子中单词的顺序

题目:输入一个英文句子,翻转句子中单词的顺序,但单词内字符的顺序不变。
句子中单词以空格符隔开。为简单起见,标点符号和普通字母一样处理。
例如输入“I am a student.”,则输出“student. a am I”。

思路:先翻转整个句子,然后翻转每个单词。

posted @ 2012-10-06 01:36  moonswap  阅读(151)  评论(0编辑  收藏  举报