数据结构&算法
文章平均质量分 84
teaspring
这个作者很懒,什么都没留下…
展开
-
线性查找-股票最佳收益
best buy and sell stockproblem 1: permitted only once buy and sellproblem 2: no limit of counts of buy and sell原创 2014-01-02 10:57:48 · 1377 阅读 · 0 评论 -
[oj.leetcode] #179 - LargestNumber, 如何在7ms内跑完 221个测试用例
题目:已知一个整型数组,如何排列使得最后组成一个最大整数,输出这个整数的字符串,假设都是非负。比如[3, 30, 34, 5, 9], 结果应该是 9534330这里选用C++。第一感觉应该是跟排序相关,稳妥方案是快速排序quick sort. 每两个数之间比较时,应从最高位开始,一位一位进行比较,将某一位更大的数排在前面。当然需要考虑当一个数是另一个数前缀时的情况,之后再原创 2015-02-08 00:01:21 · 1021 阅读 · 0 评论 -
二分查找-两已排序数组中找中位数二题
第一题来自于《算法导论》第九章习题 9.3-8. 已知两个已排序数组X[n], Y[n](假设升序),问在时间O(lgn)内找到全部2n个数中的中位数。给了提示时间O(lgn),那么必定使用二分查找。这道题的“梗”在于如何处理两个已排序数组。我们有总共2n个数,偶数,那么全局的中位数来自于两个数a,b,在排好序的2n个数中,它们以上(比它们大)和以下(比它们小)应该各有n-1个数。令a > b原创 2013-12-11 14:39:12 · 1406 阅读 · 0 评论 -
Fibonacci数列变例之一
题目来自昨天看到的一篇博客,在一个变形的Fibonacci数列中,求第N个数。变形之处是,当前两个数之和大于10时,将和拆成两个一位数。比如:0 2 2 4 6 1 0 1 1 2 3 5 8 1 33 4 7 1 1 2 3 5 8 1 3 4 7 1 1算法很简单,基本逻辑是根据前两个数是否大于10决定之后一个数或两个数,一种例外情况是头两个数都是0。int GetSumNum原创 2013-01-30 20:59:48 · 411 阅读 · 0 评论 -
两有序数组两两之和的最小k个值, 最小堆解法之完整版
原题: 给定两有序数组,长度都是n,在总共n^2个两两之和中,找到最小的k个值。题目不新鲜,出现了也有很多年了,不过在目前的面试中还有使用。较好的方法显然是用最小堆,时间复杂度降到 O(klgk)不过网上大略搜了一下,没有找到完整实现,甚至连关键点都没提到,我就这里算是个补充吧。用最小堆,元素是 A[i] + B[j]. 每次弹出堆顶,然后插入新元素,维护最小堆。这里的关键在于每次插入哪些原创 2013-11-26 23:43:42 · 1698 阅读 · 1 评论 -
动态规划-字符串处理二题
题目来自微信帐号“待字闺中”,10月15。给一个字母组成的字符串,问最少插入多少字符,变成回文串。这题估计着可以用动态规划解,不过乍看上去,不知如何下手。第一个“梗”在于如何处理“最少插入字符”,根据最少即最多的思路,如果已知给定字符串中存在的离散回文字符串长度,剩下长度就是最少插入字符。OK,有思路了,动态规划找到回文字符串,需要一个最优子结构转化式。用dp[i][i+j-1] 表示原创 2013-12-10 14:21:27 · 729 阅读 · 0 评论 -
动态规划-有向无回路图中两点间最远距离
题目来源于《算法导论》第15章动态规划的习题 15-1。说实话它困扰了我很久,直到最近才想明白其中道理。以前对最小距离作的比较多,比如对非负权值图中有Dijkstra算法,对负权值图中有Ford算法。 最远距离???假设从A到F的最远距离为A->C->D->E->F, 为什么D->E->F一定会是从D到F的最远距离?当重新审视有向(directed) 无回路(acyclic)这两个词时,原创 2013-12-10 17:34:32 · 3673 阅读 · 0 评论 -
判断回文整型数
题目来自leetcode, 要求判断一个整型数是否是回文,不使用任何额外空间。我承认,是“不使用额外空间”这句话让我想到了递归。一般判断回文字符串是一个一个字符单独比较,但是对于整型数,显然我们有更好的办法。将它从低位到高位颠倒顺序重新排列,如果跟原数一样,那就成了。bool ispalindrome(int n, int x, int m){ if(n) ret原创 2013-12-14 21:24:10 · 756 阅读 · 0 评论 -
复制数据结构 - 单链表及图
这次依然是两道算法题,复制链表,以及复制图,最后会给出一些总结。题目一,复制一个单链表(SLL - single linked list), 其节点除了一个基本的后向指针(next), 还有一个指向链表中任意一个节点的随机指针(random)。struct ranSLLNode{ char* cValue; ranSLLNode* pNext; ranSLLNode原创 2013-12-23 15:07:55 · 1593 阅读 · 0 评论 -
线性查找-数组最大距离
int A[n], find maximum j-i subjected to constraint of A[i]原创 2014-01-02 10:11:24 · 1163 阅读 · 0 评论 -
递归一题三解-将二分查找树(BST)转化成循环双链表(DLL)
题目来自leetcode: 已知一个BST(binary search tree), 将其原地转化成一个循环的排序过的双链表(circular sorted double linked list)。说明:BST的节点有两个指针left, right, 分别指向比它小,和比它大的节点。变成DLL之后,由于DLL节点原本有prev 和 next 指针分别和之前和之后的节点,这里假定原left指针指原创 2014-01-03 12:09:13 · 2299 阅读 · 0 评论 -
[oj.leetcode] #174 - Dungeon Game 一次特别的DP之旅
原题篇幅挺长,关于一个2D关卡游戏,这里就不赘述了。这里以矩阵的方式陈述一下。在一个二维数组M*N中, 有一个王子需要从起点[0][0]出发,移动到终点[m-1][n-1],每次移动一格,方向只能向右或者向下。出发前,王子的(健康)值至少为1。矩阵中每一格有一整型值,可正可负可0,对于经过的王子,会把这值加到他身上。规则是王子在移动过程中(包括到达终点),无论何时他身上的值都不能小于1。问王子原创 2015-02-19 02:21:26 · 886 阅读 · 1 评论