
算法题解
acelove40
这个作者很懒,什么都没留下…
展开
-
《剑指offer》面试题2:实现Singleton模式
题目:设计一个类,我们只能生成该类的一个实例。思路一个类要只能生成一个实例,那就需要将构造函数私有化,就能防止在外部调用构造函数生成新的实例,通过使用静态成员变量使得外部可以调用这个唯一实例。单例设计模式是经典的设计模式,常用的实现方法有懒汉模式和饥汉模式。懒汉模式是在需要使用实例的时候才创建,而饥汉模式则是从一开始就将实例生成出来。下面是饥汉模式的一个实现。class...原创 2018-03-31 22:37:48 · 189 阅读 · 0 评论 -
leetcode 1:two sum
给定一个数组和一个目标数字target,返回数组中的两个下标,这两个下标对应的数字的和为target。(约定数组中满足要求的数字对是唯一的,每个数组只能使用一次) 例子: Given nums = [2, 7, 11, 15], target = 9, Because nums[0] + nums[1] = 2 + 7 = 9, return [0, 1].解题...原创 2018-04-03 14:15:10 · 190 阅读 · 0 评论 -
《剑指offer》面试题6:从尾到头打印链表
输入一个链表的头结点,从尾到头反过来打印出每个节点的值。链表节点定义如下: struct ListNode { int val; struct ListNode *next; ListNode(int x) : val(x), next(NULL) { } };解题思路1因...原创 2018-04-03 10:11:12 · 139 阅读 · 0 评论 -
ural 1078.Srgments
很模板的一道动归题,看过跟蓝书里的那道矩形嵌套的例题是一样的,就是换个包装而已。两个线段之间的关系要么能嵌套,要么不能,这种二值的属性一般可以考虑用有向图来表示,而且它不可能互相嵌套,所以无环,故转化成DAG问题,这道题变成求DAG上的最长路径。 用一维的dp数组就可以表示,dp[u]表示以i号点为起点的最长路径长度,然后用记忆化搜索对每个点都算一遍,找到最大的值就是最长路径长度...原创 2016-03-24 11:16:20 · 377 阅读 · 0 评论 -
Ural 1223.Chernobyl’ Eagle on a Roof
题目的大意是有x(1<=x<=1000)个强度相同的蛋,有一座有y(1<=y<=1000)层的楼,蛋的强度为E(0<=E<=y),在i层把蛋扔下楼,若E<i则蛋碎一地,否则不会碎,可以继续用于实验。要求求解在最坏的情况下至少需要扔多少次才能确定蛋的强度。 很裸的动归题,最容易想的就是开个二维数组,dp[x][y]表示用x个蛋在y层楼高的楼测试最坏情况下...原创 2016-03-23 23:03:58 · 709 阅读 · 0 评论 -
ural 1013. K-based Numbers. Version 3
在这道题的版本三改了之后难度确实提高了不少,但是这道题也确实很有代表性。第一个版本是直接算,第二个版本是高精度,这个版本是10^18的量级,不可能直接算,需要使用矩阵乘法并用矩阵快速幂降低计算次数至logN量级。 动归的状态转移和前两个版本一样就不提了,主要用到的是矩阵快速幂以及边算边取模保证不爆long long,至于为什么可以边算边取模,不清楚的朋友可以看下数论相关的内容。...原创 2016-03-24 18:32:16 · 841 阅读 · 0 评论 -
《剑指offer》面试题5:替换空格
题目:实现一个函数,将字符串中的每个空格替换成字符串“%20”。解题思路1使用暴力的方法,从左到右扫描一遍,当遇到空格时就把空格替换成“%20”,然后把空格后面的字符都后移2个位置。由于需要整个字符串扫描一遍,时间为O(n),替换空格时移动字符的时间复杂度为O(n),因此总的时间复杂度为O(n^2)。解题思路2因为每个空格会替换成一个三个字符的字符串,因此替换后的新字符...原创 2018-04-02 16:33:40 · 180 阅读 · 0 评论 -
《剑指offer》面试题4:二维数组中的查找
题目:在一个二维数组中,每一行都从左向右递增,每一列都从上到下递增。给定一个数target,判断这个数是否出现在二维数组中。解题思路如果使用暴力搜索整个数组的话时间复杂度是O(n^2),比较不理想,那么有没有更快地方法呢?观察如下数组1 2 8 92 4 9 124 7 10 136 8 11 15我们可以发现,在...原创 2018-04-02 15:44:11 · 223 阅读 · 0 评论 -
《剑指offer》面试题3:数组中重复的数字
题目1:在一个长度为n的数组中所有数字的范围都在0~n-1的范围内,找出任意一个重复的数字,不存在的话返回-1。解题思路1先将数组排序,排序后重复的数字就会在相邻的位置,那么只要扫描一遍数组,对比相邻的数字就可以找出重复的数字。排序时间复杂度是O(nlogn),扫描数组复杂度是O(n),因此总的时间复杂度是O(nlogn),空间复杂度O(1),需要改变原数组。int d...原创 2018-04-01 11:26:55 · 232 阅读 · 0 评论 -
《剑指offer》面试题1:赋值运算符函数
题目的要求是为如下的类型添加赋值运算符函数class CMyString{public: CMyString(char* pData=nullptr); CMyString(const CMyString& str); ~CMyString(void);private: char* m_pData;};需要注意的点赋值运...原创 2018-03-28 16:14:20 · 222 阅读 · 0 评论