算法导论:归并排序
摘要:归并排序是建立在归并操作上的一种有效的排序算法。该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。 归并操作(merge),指的是将两个已经排序的序列合并成一个序列的操作。 对两个排序数组合并成一个有序数组,这个很简单 这个时间复杂度O(N+M) 对于一个数组的时候,l
阅读全文
算法导论:快速排序
摘要:快速排序是基于分治策略的。对一个子数组A[p…r]快速排序的分治过程的三个步骤为: 分解: 数组A[p…r]被划分成两个(可能空)子数组A[p…q-1]和A[q+1…r],使得A[p…q-1]中的每个元素都小于等于A[q],且小于等于A[q+1…r]中的元素。下标q也在这个划分过程中进行计算。 解决
阅读全文
算法导论:二叉搜索树
摘要:定义: (0)二叉树 (1)若左子树不空,则左子树上所有结点的值均小于它的根结点的值; (2)若右子树不空,则右子树上所有结点的值均大于它的根结点的值; (3)左、右子树也分别为二叉排序树 数据结构定义 插入元素 由于元素互异,插入元素的位置一定在叶子结点,递归插入程序 查找最小值 根据二叉搜索树的
阅读全文
算法导论:整齐打印
摘要:题目 考虑在一个打印机上整齐地打印一段文章的问题。输入的正文是n个长度分别为L1、L2、……、Ln(以字符个数度量)的字符构成的序列。我们希望将这个段落在一些行上整齐地打印出来,每行至多M个字符。“整齐度”的标准如下:如果某一行包含从i到j的单词(i<j),且单词之间只留一个空格,则在行末多余的空格
阅读全文
砝码称重问题二
摘要:题目描述 有一组砝码,重量互不相等,分别为m1、m2、m3……mn;它们可取的最大数量分别为x1、x2、x3……xn。 现要用这些砝码去称物体的重量,问能称出多少种不同的重量。 现在给你两个正整数列表w和n, 列表w中的第i个元素w[i]表示第i个砝码的重量,列表n的第i个元素n[i]表示砝码i的最
阅读全文
多重背包问题II
摘要:多重背包问题II 总体积是m,每个小物品的体积是A[i] ,每个小物品的数量是B[i],每个小物品的价值是C[i] 求能够放入背包内的最大物品能够获得的最大价值 和上一个很类似 上一题体积就是价值,这里的价值是单独定义了 状态转移方程 不放A[i] f[i][j] =f[i-1][j] 放A[j]
阅读全文
多重背包问题
摘要:多重背包问题 总体积是m,每个小物品的体积是A[i] ,每个小物品的数量是B[i] 求能够放入背包内的最大物品的体积 解题 和01背包问题很类似 状态转移方程 不放A[i] f[i][j] =f[i-1][j] 放A[j] 可放多个设为k, k = min(j/A[i],B[i]) f[i][j]
阅读全文
算法导论:Trie字典树
摘要:1、 概述 Trie树,又称字典树,单词查找树或者前缀树,是一种用于快速检索的多叉树结构,如英文字母的字典树是一个26叉树,数字的字典树是一个10叉树。 Trie一词来自retrieve,发音为/tri:/ “tree”,也有人读为/traɪ/ “try”。 Trie树可以利用字符串的公共前缀来节约
阅读全文
算法导论:找零钱问题
摘要:题目 假设有1元、2元、5元、10元、20元、50元、100元、200元面额的硬币或者纸币。现在需要N元钱,有多少种零钱组合方式? 解题 DFS比较简单 如上: 1.判断是否是 0 是,保存 2.是否非法 3.遍历组合可能 projecteuler31验证结果正确 当然这样会有许多重合的子问题,更改
阅读全文
算法导论:堆排序
摘要:堆 堆是一个数组,它可以被看成一个近似的完全二叉树,树上的每一个结点对应数组中的一个元素。除去最底层外,该树是完全充满的,而且从左到右填充。 用数组A表示堆,从数组第1个元素开始,数组中第i(1<=i <=n)个元素,其父结点,左孩子,右孩子的下标如下 当数组起始下标是0的时候,其父结点,左右孩子结
阅读全文
lintcode:买卖股票的最佳时机 I
摘要:买卖股票的最佳时机 假设有一个数组,它的第i个元素是一支给定的股票在第i天的价格。如果你最多只允许完成一次交易(例如,一次买卖股票),设计一个算法来找出最大利润。 样例 给出一个数组样例 [3,2,3,1,2], 返回 1 解题 法一:直接暴力,时间发杂度O(N2) public class Sol
阅读全文
KMP算法
摘要:KMP算法 KMP算法 1. 暴力匹配算法 假设现在我们面临这样一个问题:有一个文本串S,和一个模式串P,现在要查找P在S中的位置,怎么查找呢? 如果用暴力匹配的思路,并假设现在文本串S匹配到 i 位置,模式串P匹配到 j 位置,则有: 如果当前字符匹配成功(即S[i] == P[j]),则i++,
阅读全文
lintcode:最长公共子序列
摘要:题目 最长公共子序列 给出两个字符串,找到最长公共子序列(LCS),返回LCS的长度。 给出两个字符串,找到最长公共子序列(LCS),返回LCS的长度。 给出两个字符串,找到最长公共子序列(LCS),返回LCS的长度。 样例 给出"ABCD" 和 "EDCA",这个LCS是 "A" (或 D或C),
阅读全文
lintcode:最长上升子序列
摘要:题目 最长上升子序列 给定一个整数序列,找到最长上升子序列(LIS),返回LIS的长度。 给定一个整数序列,找到最长上升子序列(LIS),返回LIS的长度。 给定一个整数序列,找到最长上升子序列(LIS),返回LIS的长度。 样例 给出[5,4,1,2,3],这个LIS是[1,2,3],返回 3 给
阅读全文