俊介三

一天更新一点,一天积累一点

导航

2013年3月27日

摘要: 题目:输入n个整数,输出其中最小的k个。例如输入1,2,3,4,5,6,7和8这8个数字,则最小的4个数字为1,2,3和4。(当然:涉及真正工程项目不会这样”就事论事“,还要看为什么要找其中最小K个?这K个需不需要排序了?以后会不会变成找最大K个?等问题,要考虑到业务原因。直接给它用O(nlogn)排序好了!)思路:就遍历一遍这n个数,每次尝试放入容量为k的优先队列中。不知道这个复杂度怎么算?貌似维护一个长度为k的优先队列复杂度是O(klogk)吗?这样O(nklogk)比O(nlogn)优吗?!不知道 :(#include <stdio.h>#include <queue& 阅读全文

posted @ 2013-03-27 21:20 俊介三在前进 阅读(115) 评论(0) 推荐(0)

摘要: 题目:输入一个整数和一棵二元树。从树的根结点开始往下访问一直到叶结点所经过的所有结点形成一条路径。打印出和与输入整数相等的所有路径。例如 输入整数22和如下二元树 10 / \5 12 / \ 4 7则打印出两条路径:10, 12和10, 5, 7。这个问题最近做得烂透了。思路:把需要带到叶子的中间结果作为参数放在递归函数里,每次往里加~(我再看看别人又是如何写的。。)我的代码:#include <iostream>#include <stdlib.h>#include <stack>#include <queue>using namespace 阅读全文

posted @ 2013-03-27 20:53 俊介三在前进 阅读(126) 评论(0) 推荐(0)

摘要: 题目:输入一个整形数组,数组里有正数也有负数。数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和。求所有子数组的和的最大值。要求时间复杂度为O(n)。例如输入的数组为1, -2, 3, 10, -4, 7, 2, -5,和最大的子数组为3, 10, -4, 7, 2,因此输出为该子数组的和18。找到状态转移方程,dp[i]表示前i个数中,包含i的子数组的最大和。要么第i个数自己最大,要么他要和包含i-1的子数组最大和(即dp[i-1])联合在一起.即dp[i] = max{arr[i],dp[i-1]+arr[i]};代码如下;#include <stdio.h>#de 阅读全文

posted @ 2013-03-27 20:31 俊介三在前进 阅读(100) 评论(0) 推荐(0)

摘要: 题目:定义栈的数据结构,要求添加一个min函数,能够得到栈的最小元素。要求函数min、push以及pop的时间复杂度都是O(1)。思路:最初以为不就push进来,对比一下已有的,再标记当前最小的嘛。。后来发现,pop出去的时候,有可能min就不同了,恢复不了之前min的值,囧。应该再开辟一个栈(称为栈B),栈B和原栈(称为栈A)同步push,同步pop,且栈B的顶是栈A最小值的index,这样同步push和pop就能保证一直维护这这个min代码:#include <stdio.h>#include <iostream>#include <memory.h>s 阅读全文

posted @ 2013-03-27 20:15 俊介三在前进 阅读(167) 评论(0) 推荐(0)

摘要: 题目:输入一棵二元查找树,将该二元查找树转换成一个排序的双向链表。要求不能创建任何新的结点,只调整指针的指向。10/ \6 14/ \ / \4 8 12 16转换成双向链表4=6=8=10=12=14=16。思路:可以看到双链表的排序是二叉树中序遍历的结果。因此,我们可以中序遍历二叉树,每次访问一个节点,就把它添加进我们的双链表来,注意,添加的意思是是改变一个指针而已,不需要额外的空间。。当然,需要记录一下双链表的头,以及每一次双链最后那个node。见代码:#include <stdio.h>#include <stdlib.h>#include <stack& 阅读全文

posted @ 2013-03-27 19:31 俊介三在前进 阅读(143) 评论(0) 推荐(0)