
c++
nisxiya
Still a graduate student in ss of Peking UniversityGood at python, Java, C, Linux VimLearning Algorithms
展开
-
基于树的动态规划
问题描述很多时候,我们所做的DP(Dynamic Programming)通常是基于很简单的数据结构,比如一维数组、二维数组、甚至更高维的数组。今天刷 hihocoder的时候,遇到了一道题,很有意思,是树上的DP。题目 1055 : 刷油漆 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 上回说到,小Ho有着一棵灰常好玩的树玩原创 2015-04-23 17:02:11 · 984 阅读 · 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 评论 -
数组进行多少次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 评论 -
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 评论 -
对给定数组按奇偶性划分,不改变相对顺序
问题描述给定一个数组,比如 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 评论 -
C++ STL lower_bound & upper_bound
background首先,lower_bound和upper_bound是C++ STL中提供的非常实用的函数。其操作对象可以是vector、set以及map。lower_bound返回值一般是>= 给定val的最小指针(iterator)。upper_bound返回值则是 > 给定val的最小指针(iterator)。vector中的lower_bound & upper_bound// lowe原创 2015-04-08 19:47:53 · 10861 阅读 · 0 评论 -
矩阵中求子矩形
问题描述有一个 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 评论 -
加油站问题
问题描述有一个环形轨道,上有若干加油站,一辆小车(初始时油箱为空,油箱容量无线)从某个加油站出发绕一圈,路上需要耗油,已知 加油站的总油量和路上需要消耗地油量一样多,问是否可以找到从一个加油站出发,小车可以正常绕一圈?问题解析其实上面的题与下面的题目类似:有一个循环数组,{1, 2, -3, 4, -5, -8, 9},问找出一个数,使得从该数出发,往右的所有子数组,比如 {2}, {2,-3},原创 2015-05-08 10:21:52 · 1087 阅读 · 0 评论 -
使用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 评论 -
BST树遍历O(n)时间复杂度+O(1)空间复杂度
问题描述BST树的遍历问题常常遇到,前序、中序、后序等。如果用递归的话,是非常方便的,其时间复杂度是O(n),空间复杂度是O(log n)级别。PS:stackoverflow问答网站上有一个问题指出,这类问题的复杂度不应该直接说是O(log n),因为编译器会进行一些优化,比如修改成尾递归等。不过我们这里暂时不考虑优化,从程序逻辑上来讲,BST递归遍历认为是O(log n)的复杂度。OK,那么如果原创 2015-04-14 21:08:51 · 9142 阅读 · 1 评论 -
【c++】语言基础:++i & i++ 的底层区别
++i 和 i++的底层区别++i,是先取 i 的地址,增加它的内容 ,然后把值放到寄存器中i++,是先取 i 的地址,把它的值装入寄存器,然后增加内存中 i 的值关于 ++i 是左值,而 i++ 是右值的问题++i,返回值是 i 本身自己,是一个变量i++,返回值是 i 之前的一个数值,是一个数,不是变量因此 ++(i++) 这就是错误的,因为 i++ 返回的是右值,而不能 ++右值。原创 2015-04-20 14:52:22 · 1612 阅读 · 0 评论 -
有序单链表转BST树+时间复杂度要求O(n)
问题描述针对有序的数组或链表,要转为相对平衡的BST树时,通常有多种做法。 1. 对于有序的数组A,转为BST时,取数组中间元素A[m],转为根,然后递归转换A[1..m-1], A[m+1 .. n]即可。时间复杂度 T(n) = 2 * T(n/2) + O(1),得出T(n) = O(n) 2. 针对有序的链表,如果依据上述方法,也可以进行。然而要取到A[m]的话,则需要遍历n/2长度原创 2015-04-15 23:28:24 · 1607 阅读 · 0 评论 -
BAT技术面试最喜欢考的两个编程题
关于字符串的编程题真的是太常见了,而且是非常吸引BAT等公司IT技术面试官。这类题目一般都是不难的,核心代码都是非常简单,但是需要注意的细节是太多了,而这也正是考察了面试者的技术功底。关于字符串的考题,常见的有strncpy, strncat等等。strncpy代码来自Linux Manual手册 (在linux终端输入 man strncpy 就可以看到了) char *原创 2015-04-09 21:42:25 · 1878 阅读 · 0 评论 -
C++虚表函数解析
本文转载:http://blog.youkuaiyun.com/haoel/article/details/1948051《C++ 虚函数表解析》陈皓 http://blog.youkuaiyun.com/haoel前言C++中的虚函数的作用主要是实现了多态的机制。关于多态,简而言之就是用父类型别的指针指向其子类的实例,然后通过父类的指针调用实际子类的成员函数。这种技术可以让父类的指针有“多种形态”,这是一种泛型技术。所转载 2015-04-25 00:06:00 · 658 阅读 · 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 评论 -
博弈游戏·Nim游戏·二
题目1 : 博弈游戏·Nim游戏·二时间限制:10000ms单点时限:1000ms内存限制:256MB描述Alice和Bob这一次准备玩一个关于硬币的游戏:N枚硬币排成一列,有的正面朝上,有的背面朝上,从左到右依次编号为1..N。现在两人轮流翻硬币,每次只能将一枚正面朝上的硬币翻过来,并且可以随自己的意愿,在一枚硬币翻转后决定要不要将原创 2015-05-11 12:50:51 · 1359 阅读 · 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 评论 -
装箱问题(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 评论 -
C++ priority_queue 最大堆、最小堆
问题描述通常在刷题的时候,会遇到最大堆、最小堆的问题,这个时候如果自己去实现一个也是OK的,但是通常时间不太够,那么如何处理?这时,就可以借助C++ STL的priority_queue。具体分析需要注意的是,C++ STL默认的priority_queue是将优先级最大的放在队列最前面,也即是最大堆。那么如何实现最小堆呢?假设有如下一个struct:struct Node { int原创 2015-05-14 20:35:16 · 31310 阅读 · 1 评论