Coding
YoungC_
这个作者很懒,什么都没留下…
展开
-
设计包含min函数的栈
题目:定义栈的数据结构,要求添加一个min函数,能够得到栈的最小元素,并且要求时间复杂度是O(1)。思路:1.如何找到一个栈中最小的元素,要遍历一遍(pop)确定最小元素后再push进去,但这个时间复杂度肯定不对。所以就要想增加空间复杂度来减少时间复杂度。2.如果我用一个元素来记录最小元素,貌似可行,但是想到如果记录最小元素被pop出去后,怎么才能将最小元素指向第二小元原创 2013-11-25 21:18:52 · 733 阅读 · 0 评论 -
二元查找树转变成排序的双向链表
描述:输入一颗二元查找树,将二元查找树转换成一个排序的双向链表。要求不能创建人新创建的结点,只调整指针的指向。我的思路:利用递归思想进行解答。1.分解,将结点P分解成左子树和右自树两个部分。2.解决子问题,左子树变成一个双向链表,右子树变成一个双向链表。3.合并,将结点P的left 连接到左子树中最大的结点,将结点p的rignt连接到右子树中最小的结点。最后,将原创 2013-11-25 21:10:02 · 699 阅读 · 0 评论 -
求子数组的最大和
题目:输入一个integer数组,数组中连续的一个或者多个整数组成一个子数组,每个子数组都有一个和。求所有子数组的最大和,要求时间复杂度为O(n)思路:1.时间复杂度是O(n) 是什么概念,要求仅遍历常数次数组。2.假设计算到数组的第k个数,那么前k-1个数的和可能有如下情况:2.1 k-1的数的和是负数或者0,那么就抛弃,因为一个负数加一个数只会更小。2.2 k-原创 2013-11-25 21:40:02 · 714 阅读 · 0 评论 -
判断正数序列是不是二叉查找树的后序遍历结果
题目:输入一个正数数组,判断该数组是不是某二叉查找树的后序遍历结果。如果是,返回true,如果不是返回false思路:1.分治法:分解:找到一个pivot,判断p到pivot结点以及pivot到q-1结点的两个子序列是否满足条件。合并:当两个子序列满足条件后,判断第一个子序列的结点是否都小于根结点,第二个子序列的结点是否等大于根结点。2.如何找到该pivot。原创 2013-11-26 19:05:44 · 614 阅读 · 0 评论 -
二叉树中找出和为某一值的所有路径
题目:输入一个整数和一颗二叉树。从树结点到叶结点经过的结点定义为一条路径。找出路径上所有结点和为该整数的路径并打印出来。定义二叉树结点为下:struct BinaryTreeNode{int value;BinaryTreeNode* left;BinaryTreeNode* right;};思路:1.典型递归。2.设当前结点是p,用整数原创 2013-11-26 11:58:32 · 764 阅读 · 0 评论 -
找出数组中最小的k个元素
题目:输入n个整数,输出整数中最小的k个元素。思路:1.朴素算法,利用random快排,在nlgn时间内得到排序好的数组,然后输出前k个。时间复杂度有点高啊~2.对想法1进行优化,是否可以先对k个数进行排序,时间复杂度klgk,然后对一个排好序的数组进行二分插入需要lgk的时间,做n-k次,则可以完成,时间复杂度为nlgk代码如下: int piviot原创 2013-11-26 17:34:14 · 1205 阅读 · 0 评论 -
单向链表的查找问题
题目:输入一个单向链表。如果该链表的结点数为奇数,输出中间的结点;如果链表结点数为偶数,输出中间两个结点前面的一个。思考:最简单的解法:从头到尾遍历一遍数组,得到链表大小n。然后再从头走n/2次,则一共需要的时间为1.5n。优化:想起以前一道题目,用n的方法反转一个单向链表。如果只用一个变量header,是不可能的,用了preHeader,proHeader,nowHead原创 2014-03-05 19:50:13 · 894 阅读 · 0 评论 -
字符串中第一次出现的只出现一次的字符
题目:给一个字符串"abadfawefwfasf",找出第一个只出现一次的字符。分析:自从看过计数排序之后,发现很多题目都是针对计数排序的扩展。字符只有256个,好处,就是我们能有一个固定的空间大小的一个数组来统计每个字符出现的次数,只需要n的时间,然后再从头到尾遍历一遍即可。代码:void findFirstOne(char *str){ if (原创 2014-03-17 21:13:21 · 638 阅读 · 0 评论