
算法
文章平均质量分 59
nisxiya
Still a graduate student in ss of Peking UniversityGood at python, Java, C, Linux VimLearning Algorithms
展开
-
关于Ackermann函数的计算方法
//带备忘的二维辅助空间计算Ackermannint Ackermann(m, n) { 1. if A[m,n] >= 0 2. then return A[m, n]; 3. else if m = 0 and n > 0 4. then A[m,n原创 2013-11-29 22:18:26 · 2707 阅读 · 1 评论 -
矩阵中求子矩形
问题描述有一个 n * n的矩形,其中每个元素只可能是0 or 1。比如如下矩阵A:1 1 0 00 0 1 11 0 1 01 1 0 1其中 A[0][0], A[0][1], A[3][0], A[3][1] 这四个元素恰好是一个长方形的四个角,且每个元素都是1. 因此称这四个元素围成了一个子矩形。现在需要判断,给定的矩阵A中,判断是否存在这样四个元素,都是1,且恰好围成一个子矩形?解决原创 2015-05-29 14:45:43 · 2222 阅读 · 0 评论 -
[Lintcode] Maximum Gap Problem
问题描述在一个无序的数组中,如果对其进行排序,然后扫描一遍有序数组,可以获得相邻两元素的最大差值,比如 {-1, 2, 4, 9},那么最大差值就是4和9之间,是5. 现在如果不对原始数组进行排序,有什么好的方案,来获取有序形式下的最大差值? Given an unsorted array, find the maximum difference between the successive原创 2015-05-31 16:29:17 · 1618 阅读 · 0 评论 -
【算法】直方图中最大面积问题
问题描述给定一个直方图,求这个直方图中最大矩阵对应的面积是多少? 比如有个图如下 (对应的数组为:[2,1,5,6,2,3]) 那么对应的最大矩形的面积应该为 10: 问题分析这类题是很常见的一道题,也是面试当中很容易考到的一题。解决方法倒是挺多。常见的比如Divide-and-conqure等方法,复杂度也都是O(n log n)。 现在有没有一种更快的方法呢?复杂度可以达到 O(n)问题原创 2015-06-19 16:26:14 · 5545 阅读 · 0 评论 -
中序遍历二叉树+O(1)空间
问题描述中序遍历二叉树时,很简单,需要加上递归就可以优雅地实现了。当然,使用递归的话,函数调用栈的空间就会达到O(log n)。那么有什么方式,可以使得中序遍历二叉树的复杂度为O(1)呢?问题分析既然要保证O(1)复杂度,那么就不能使用递归调用了。目标方案应该是使用while或for循环的方式。下面借用一张图来解释(来源:http://www.2cto.com/kf/201402/277873.ht原创 2015-06-22 10:45:02 · 1780 阅读 · 0 评论 -
[Lintcode] Best Time to Buy and Sell Stock IV
问题描述Say you have an array for which the ith element is the price of a given stock on day i. Design an algorithm to find the maximum profit. You may complete at most k transactions.Example Given price原创 2015-05-23 11:00:10 · 1019 阅读 · 0 评论 -
n*m 矩阵: set matrix zeroes
问题描述有个 N * M 的矩阵,其中有的元素是 0,如果是 0,那么将该行和该列都设置为0. 需要 O(1) 的空间复杂度问题分析初看此问题,确实很简单,没有过多算法内容。 如果有 O( M + N) 的空间,那么可以存储所有的含有 0 的列和行。然后再逐一设置 0 即可。 现在要求是使用 O(1) 的空间复杂度,该如何处理?问题求解扫描 (Row >= 1 && Column >= 1)原创 2015-06-11 17:01:10 · 889 阅读 · 0 评论 -
数组进行多少次OP操作,才能有序
1 题目描述:有一个数组:2,1,4,3。对于数组,有一种操作op(idx):将该index对应的数字移到首位。比如:op(3): 2 1 4 3 -> 3 2 1 4op(1): 3 2 1 4 -> 2 3 1 4op(2): 2 3 1 4 -> 1 2 3 4 问对于给定的数组,数组各个元素是任意的整数,可能有重复值,需要多少次OP操作,才能使得数组有序?原创 2015-07-05 12:57:36 · 1397 阅读 · 0 评论 -
【c++】map 迭代器删除示例
C++ STL中的map是非常常见的。通常我们用如下方式来遍历,并且删除map中的一些entry:map<int, int> mp;mp.insert(make_pair(1,1));mp.insert(make_pair(2,3)); // insert some elementsfor (map<int, int>::iterator iter = mp.begin(); iter !=原创 2015-07-26 19:51:29 · 7174 阅读 · 1 评论 -
lintcode: ugly number
问题描述Ugly number is a number that only have factors 3, 5 and 7.Design an algorithm to find the Kth ugly number. The first 5 ugly numbers are 3, 5, 7, 9, 15 …问题分析这个题,有多种方法求解,常见的是有辅助数据结构,比如priority_queue,原创 2015-07-05 23:42:31 · 2076 阅读 · 0 评论 -
[poj] The Wedding Juicer | [lintcode] Trapping Rain Water II
问题描述给定一个二维矩阵,每个元素都有一个正整数值,表示高度。这样构成了一个二维的、有高度的物体。请问该矩阵可以盛放多少水?相关题目:POJ The Wedding JuicerDescriptionFarmer John’s cows have taken a side job designing interesting punch-bowl designs. The designs are cr原创 2015-08-09 11:34:37 · 1266 阅读 · 0 评论 -
bk树:编辑距离算法
算法出处:Matrix67大神,http://www.matrix67.com/blog/?s=bk%E6%A0%91背景 除了字符串匹配、查找回文串、查找重复子串等经典问题以外,日常生活中我们还会遇到其它一些怪异的字符串问题。比如,有时我们需要知道给定的两个字符串“有多像”,换句话说两个字符串的相似度是多少。 1965年,俄国科学家Vladimir Levenshtein给字符转载 2015-07-29 00:51:25 · 3682 阅读 · 0 评论 -
[微软苏州校招 Hihocoder] Disk Storage
#1100 : Disk Storage时间限制:10000ms单点时限:1000ms内存限制:256MB描述Little Hi and Little Ho have a disk storage. The storage's shape is a truncated cone of height H. R+H is radius o原创 2015-08-12 15:45:32 · 1771 阅读 · 0 评论 -
对给定数组按奇偶性划分,不改变相对顺序
问题描述给定一个数组,比如 arr = { 1, 3, 1, 4, 1, 5, 2, 0},对该数组进行整理,使得所有奇数都在前面,所有的偶数都在后面,且保证所有奇数的相对顺序不改变,所有偶数的相对顺序不改变。问题解决Solution1:T(n) = O(n^2), S(n) = O(1)利用冒泡排序的思想,对数组进行整理即可。 思想:扫描数组,针对每个发现的奇数,都利用冒泡技术,往前移动该奇数,原创 2015-08-14 20:44:45 · 2241 阅读 · 0 评论 -
Best time to buy and sell stocks IV
题目https://leetcode.com/problems/best-time-to-buy-and-sell-stock-iv/ Say you have an array for which the ith element is the price of a given stock on day i. Design an algorithm to find the maximum原创 2015-07-24 08:37:26 · 627 阅读 · 0 评论 -
Treap Demo
#include #include #include #include #include #include #include using namespace std;struct Node { Node *ch[2]; int priority; int val; int cmp(int x) const { if (val == x) return -1; r原创 2014-10-23 19:33:53 · 571 阅读 · 0 评论 -
装箱问题(NP问题)
问题描述有n个物品,体积为 v[i],i = 1..n。 现在有若干同样的箱子,体积为C,C > v[i], i = 1..n。问最少需要多少箱子,才能装下所有的物品。问题求解这类问题是NP问题,即可以在多项式时间内验证一个解是否OK,但是不可以在多项式时间内求得该解。 装箱问题,有个近似解。First Fit (FF)首次适应解法。对于物品 i ,从当前装了物品的箱子中找到首个,其剩余容量可以放原创 2015-05-06 11:30:56 · 11423 阅读 · 0 评论 -
P, NP 问题
P问题:多项式时间可以解决的问题。NP问题: 多项式时间可以验证某种解法。但是是否可以多项式时间内解决某种问题,仍然得不到证明或证否。P属于NP问题,但是 P和NP 是否相等,仍然未解。NPC问题:一些比较难的NP问题,可以归约到NPC问题,即更为通用的一种解法,可以解决较多的NP问题。人们发现NPC问题,很难有多项式时间解法,因此人们逐渐相信NPC不可多项式解决,也就逐渐相信 P != NP。一些原创 2015-05-06 10:43:47 · 738 阅读 · 0 评论 -
多处理机调度问题(NP)
问题描述有 n 个独立的任务,分配给 m 个相同的处理机进行处理,每个任务所花费的时间为 t[i], i = 1..n,每个任务独立,不可分割,不可中断。问题:这些处理机要处理完这些任务,所需要花费的最短时间是多少?问题解决该问题也是NP问题,也跟上篇博客中的装箱问题类似:http://blog.youkuaiyun.com/nisxiya/article/details/45533811 装箱问题,是给定容原创 2015-05-06 11:47:56 · 9283 阅读 · 0 评论 -
C++ 标准库之algorithm
The header defines a collection of functions especially designed to be used on ranges of elements.A range is any sequence of objects that can be accessed through iterators or pointers, such as转载 2013-12-12 20:46:55 · 737 阅读 · 0 评论 -
About sort and qsort in c
1. for sort herestruct POINT{ __int64 a; __int64 b; bool operator < (const POINT &p) const { if(a==0&&b==0) return 0>1; if(p.a==0&&p.b==0) return 1>0; __int64 l1 = (a)*(p.b); __int64 l2 =原创 2014-01-21 10:27:28 · 897 阅读 · 0 评论 -
【算法】【树】最近公共祖先LCA——Tarjan算法
class LCA_problem {public: const static int N = 10000 + 10; int parent[N]; int ancester[N]; vector tree[N]; vector qes[N]; bool isroot[N]; bool visited[N]; int n;原创 2014-08-31 11:31:22 · 798 阅读 · 0 评论 -
二分图最佳完美匹配——Kuhn-Munkres算法 (最大权匹配)
二分图最大权匹配的代码:#include #include #include #include using namespace std;#define N 100class Solution {public: int S[N]; int left[N]; // the id in left that matches an id in the right co原创 2014-11-12 16:00:35 · 2808 阅读 · 0 评论 -
【牛顿迭代逼近】求根号2的快速方法
如果要求根号2,比较快的方法有:1)二分法;2)牛顿迭代逼近法转载 2014-11-13 15:05:46 · 22201 阅读 · 1 评论 -
【并查集】食物链问题
食物链Time Limit: 1000MS Memory Limit: 10000KTotal Submissions: 46219 Accepted: 13452Description动物王国中有三类动物A,B,C,这三类动物的食物链构成了有趣的环形。A吃B, B吃C,C吃A。 现有N个动物,以1-N编号。每个动原创 2014-10-28 16:47:03 · 853 阅读 · 0 评论 -
【trie树】insert和search操作
#include #include #include #include using namespace std;#define N 26struct TrieNode { char *data; TrieNode* branch[N]; TrieNode() { data = NULL; for (int i = 0; i原创 2014-11-14 13:00:35 · 844 阅读 · 0 评论 -
KMP算法伪码
KMP-MATCHER(T, P)n <- length[T]m <- length[P]pi <- COMPUTE-PREFIX-FUNCTION(P) // pi is just the pattern of P stringq <- 0for i <- 1 to n do while q > 0 and P[q+1] != T[i] do q <- p转载 2014-11-30 22:26:09 · 906 阅读 · 0 评论 -
高效字符串匹配之Boyer-Moore & Rabin-Karp
1,Boyer-Moore算法Boyer-Moore算法是将字符串匹配的过程逆转,是从右到左匹配的。S串为待匹配串,T串为模式串。T沿着S不断向右移动,针对每次的位置,先判断T[m-1]是否匹配上,接着判断T[m-2], T[m-3]... T[0]。如果匹配不上,则向右移动T一个skip距离。这个skip不一定是1。2,Rabin-Karp算法翻译 2014-12-06 09:52:16 · 779 阅读 · 0 评论 -
最长回文子串算法
#1032 : 最长回文子串时间限制:1000ms单点时限:1000ms内存限制:64MB描述 小Hi和小Ho是一对好朋友,出生在信息化社会的他们对编程产生了莫大的兴趣,他们约定好互相帮助,在编程的学习道路上一同前进。 这一天,他们遇到了一连串的字符串,于是小Hi就向小Ho提出了那个经典的问题:“小Ho,你能不能分别在这些字符原创 2015-01-15 20:54:07 · 847 阅读 · 1 评论 -
使用STL来模拟Treap的功能
问题描述我们知道,Treap可以完成节点的动态插入、删除、查询,其每个操作的时间复杂度是O(log n),因为其实现较红黑树更为简单,因此常常用于某些场合,以替换红黑树的实现。Treap的每个节点维护了key, priority。struct Node { int key; int priority; Node (int k, int p): key(k), priority原创 2015-04-19 16:36:31 · 1521 阅读 · 0 评论 -
基于树的动态规划
问题描述很多时候,我们所做的DP(Dynamic Programming)通常是基于很简单的数据结构,比如一维数组、二维数组、甚至更高维的数组。今天刷 hihocoder的时候,遇到了一道题,很有意思,是树上的DP。题目 1055 : 刷油漆 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 上回说到,小Ho有着一棵灰常好玩的树玩原创 2015-04-23 17:02:11 · 984 阅读 · 0 评论 -
2D矩阵求最大正方形子矩阵,各项元素为1
问题描述对于一个 m * n 的矩阵,每项元素为 0 或 1. 问题1求该矩阵中的最大子矩阵,子矩阵可以为长方形,但是子矩阵内的各项元素均为 1。解决1针对这个问题,可以枚举子矩阵的左右边界,复杂度为 O(n^2)。针对该边界内的m行,从上到下扫一次,每行的和,如果为左右边界之差,那么该行的每项元素都为 1 。从上往下扫各行,求得最长连续地满足要求的行数。从而可以求得子矩阵的面积。 求特定边界内每原创 2015-04-29 11:09:12 · 2146 阅读 · 0 评论 -
加油站问题
问题描述有一个环形轨道,上有若干加油站,一辆小车(初始时油箱为空,油箱容量无线)从某个加油站出发绕一圈,路上需要耗油,已知 加油站的总油量和路上需要消耗地油量一样多,问是否可以找到从一个加油站出发,小车可以正常绕一圈?问题解析其实上面的题与下面的题目类似:有一个循环数组,{1, 2, -3, 4, -5, -8, 9},问找出一个数,使得从该数出发,往右的所有子数组,比如 {2}, {2,-3},原创 2015-05-08 10:21:52 · 1087 阅读 · 0 评论 -
M * N 矩阵的骨牌覆盖问题
问题描述有一个 M * N的矩阵,现在需要使用 1 * 2 的骨牌进行覆盖,问总的覆盖方案数有多少? 题目链接:http://hihocoder.com/contest/hiho43/problem/1问题求解标记骨牌覆盖状态 1, 横向排的骨牌表示: 1 1 2, 纵向排的骨牌表示: 0 1骨牌状态转移 对于第 i 行与第 i+1 行,其中某段格子状态如下:原创 2015-05-09 11:19:31 · 2535 阅读 · 0 评论 -
C++ priority_queue 最大堆、最小堆
问题描述通常在刷题的时候,会遇到最大堆、最小堆的问题,这个时候如果自己去实现一个也是OK的,但是通常时间不太够,那么如何处理?这时,就可以借助C++ STL的priority_queue。具体分析需要注意的是,C++ STL默认的priority_queue是将优先级最大的放在队列最前面,也即是最大堆。那么如何实现最小堆呢?假设有如下一个struct:struct Node { int原创 2015-05-14 20:35:16 · 31310 阅读 · 1 评论