自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(22)
  • 资源 (4)
  • 问答 (1)
  • 收藏
  • 关注

原创 Frog Jump

这道题充分的展示了dfs暴力搜索和动态规划的关联和区别。对于dfs来说,进入下一次迭代是有判断条件的,这个判断条件对应动态规划中的递推公式。但是dfs的时间复杂度是O(C^n),其中C是常数。相比之下,动态规划的时间复杂度是O(n^2)。虽然动态规划中的一些查找操作也会耗费掉一些时间,但是通过使用合适的数据结构可以缩短这部分时间,改进之后的dp算法可以AC。先上dfs的代码,做了最多的剪枝

2016-11-30 09:57:49 291

原创 Edit Distance

用动态规划求解这一点应该是毫无疑问的,但是递推公式实在是太蛋疼了EDIT[i,j] = min( EDIT[i - 1,j] + 1, EDIT[i,j - 1] + 1, EDIT[i-1, j - 1] + f(x[i],y[j]))EDIT[i,j]表示对于字符串a从1到i的子串和字符串b从1到j的字串的编辑距离。(字符串下标从1开始)EDIT[i - 1,j] + 1表

2016-11-29 16:50:28 183

原创 Distinct Subsequences(研究之后用自己的方法做的解释,易懂)

很奇怪的动态规划公式,网上的解释都很不清楚,我研究了半天,详细解释一下吧例子:T:rab   S:rabb那么当S[ j ] == T[ i ]时,动态规划公式用实际情况表达出来就是:  dp[i][j]    =    dp[i][j-1]      +    dp[i-1][j-1]T: rab                 rab

2016-11-28 20:52:23 877

原创 Sliding Window Maximum

可以使用双向队列,对双向队列的查询时间进行优化的话,就可以使用set,set是通过红黑树实现的class Solution {public: vector maxSlidingWindow(vector& nums, int k) { vector r; multiset window; for (int i = 0; i < nums.size(); i++) { wi

2016-11-27 09:29:03 138

原创 Serialize and Deserialize Binary Tree

原理很简单,dfs前序遍历一遍就好了这里记录一下使用stream而不是for循环来对字符串进行分割,使得代码非常简单,以前见过一次这种方式,这里加强一下记忆class Codec {public: // Encodes a tree to a single string. string serialize(TreeNode* root) { if (ro

2016-11-26 09:06:48 212

原创 Patching Array

一开始想到了dfs,感觉时间复杂度太大了,后来参照了网上的答案。注意,数组中的数字是不能重复使用的。定义一个变量miss,用来表示[0,n]之间最小的不能表示的值。那么此时我们能表示的范围是[0, miss),即能表示0到miss-1的数,如果此时的num miss,那么此时我们需要添加一个数,为了能最大限度的增加表示数范围,我们加上miss它本身,以此类推直至遍历完整个数组,我们可以得到

2016-11-25 09:35:29 141

原创 Russian Doll Envelopes

看到题目后脑洞大开,信封一层套一层这不就是有向图吗,那这道题不就是求有向图最长路径吗,然后看了半天拓补排序和排序过后动态规划求最长路径。然而答案一个sort函数加动态规划就解决了,嘛,原理还是一样的class Solution {public: int maxEnvelopes(vector>& envelopes) { int res = 0, n = envelopes.siz

2016-11-24 14:31:18 200

原创 Max Sum of Rectangle No Larger Than K

参考:https://www.youtube.com/watch?v=yCQN096CwWM  用动态规划求一个矩阵的子矩阵,这个子矩阵的元素和最大视频的开头展示了如何求一个一维数组的最大子数组和,然后把二维数组降维到一维数组进行动态规划求解。下面的代码实际上修改了视频中的计算一维数组最大子数组和的部分,改为了求不大于k的最大子数组和。class Solution {public:

2016-11-23 10:56:21 177

原创 Count of Smaller Numbers After Self

记录一下  STL大法好   distance那里还可以通过memorization优化一点class Solution {public: vector countSmaller(vector& nums) { vector t, res(nums.size()); for (int i = nums.size() - 1; i >= 0; --i) { int d = di

2016-11-22 11:07:28 224

原创 Populating Next Right Pointers in Each Node II

时间换空间,使用几个指针,多做几次遍历查找class Solution {public: void connect(TreeLinkNode *root) { if (NULL == root) return; TreeLinkNode* start; TreeLinkNode* curNode; TreeLinkNode* nextNode; while (root

2016-11-21 09:04:04 188

原创 Remove Invalid Parentheses

求解有多个结果的组合问题时,首先想到暴搜,如果不行,那就加上memorization剪枝(感觉和dp有点像,都是通过记录并查询中间变量来减少计算的)这道题还有一个需要注意的地方:bfs下降过程中,第一次找到合法的括号组合就不在进行bfs计算了,因为我们不想找到 "()()", "()" 这样的后一个比前一个小的结果第一次找到合法的括号组合后,剩下的工作就是做valid check了。m

2016-11-20 10:13:45 219

原创 Longest Increasing Path in a Matrix

第一眼看到就知道是dfs,然而时间复杂度太大了,要降时间只能用空间来换,也就是采用矩阵记录算法运行过程中的临时最长序列。正好前几天在看floyd算法,这道题和floyd算法太像了,代码中都是三个for循环。虽然这道题把for放在了dfs递归中,增加了不少时间复杂度,但是二者的原理还是一样的。class Solution {public:int dx[4] = { 1 , -1, 0 ,

2016-11-19 16:42:59 171

原创 Longest Consecutive Sequence

把需要nlog(n)及以上的时间复杂度降低为O(n)的时间复杂度,可以使用:哈希映射并且标记已经访问过的树class Solution {public: int longestConsecutive(vector &num) { if(num.empty()) return 0; unordered_set existSet;

2016-11-17 09:12:47 160

原创 Trapping Rain Water II

维护一个最小堆,保存最外围的高度每次取堆中最小高度 h,查看周围4个没有被访问过的元素:如果某个周围元素的高度小于 h,则注入水到其中,并将其加入到最小堆中,设置该元素被访问过,记录注水的量,即增加ans如果某个周围元素的高度大于 h,则直接将其加入到最小堆中,设置改元素被访问过class Solution {public: struct Node { int x, y,

2016-11-16 11:16:53 182

原创 Data Stream as Disjoint Intervals

插入的新值有三种情况:1、可以和右边合并2、可以和左边合并3、既不能和右边合并也不能和左边合并class SummaryRanges {private: map m;public: /** Initialize your data structure here. */ SummaryRanges() { }

2016-11-13 10:46:34 201

转载 Burst Balloons

discussion原文:点击打开链接最初的想法:     看到这个题目,很显然,第一反应不是用动态规划解决,而是回溯:     假设现在有n个气球,所以按照题意,若每踩一个气球定义为一个step,则需要n个step才能完成游戏。当进行到第i个step的时候(i算法的复杂度为O(n!),无法接受。所以下面我们逐步优化。通过观察可以知道。定义:现存的气球集合N,被

2016-11-12 10:53:08 231

原创 Find the Duplicate Number

在区别[1, n]中搜索,首先求出中点mid,然后遍历整个数组,统计所有小于等于mid的数的个数,如果个数大于mid,则说明重复值在[mid+1, n]之间,反之,重复值应在[1, mid-1]之间,然后依次类推记录一个非常优雅的二分法代码class Solution {public: int findDuplicate(vector& nums) { int low = 1,

2016-11-11 14:56:00 168

原创 Validate Binary Search Tree

中序遍历,结果递增的话就说明是一颗二叉搜索树这里用了一个trick,用prev保存前驱节点,dfs的同时做比较class Solution {public: bool isValidBST(TreeNode* root) { TreeNode* prev = NULL; return validate(root, prev); }

2016-11-08 10:34:38 176

原创 SQLite数据库文件格式逐字节详解

sqlite用B+树的形式组织数据库中的数据。B+树有内部节点和叶子节点两种节点,对应的,数据库文件也有内部节点页和叶子节点页。 数据库中存储着两种数据,一种是表中的数据的集合(这些数据构成了一个表),一种是所有表的根节点集合(所有的表的根节点构成了master_catalog)。这两种数据都是通过B+树组织起来的,数据库文件中4KB大小的一个部分构成B+树的一页。执行命令:”create tab

2016-11-06 21:56:06 8142

原创 Longest Substring Without Repeating Characters

使用两个指针 i , j , 从前向后遍历数组,如果遇到已存在的字符,应该回退到这个字符上次出现的下一个位置从新开始统计。用哈希表存储字符出现的位置可以把查询时间降低到O(1)。class Solution {public: /* Use left pointer i and right pointer j. When we met s[j] which is already be

2016-11-06 19:15:55 194

原创 dijkstra求多条最短路径(附源码)

源码参见github:https://github.com/silenceMg/multiShortestPath手绘了半天图实在是没精力对dijkstra做基本介绍了,本文默认大家对dijkstra已经有了基本的了解。然后就是看图说话了:1.原始的图,圆圈中的数字代表节点编号2.接下来是多条最短路径dijkstra算法的运行过程图解,圆圈中第一个数字是走到当前节点时花费的co

2016-11-06 16:11:00 5326 1

原创 Maximum Product Subarray

想到了动态规划,但是一直不知道该怎么处理负数想到了负负得正,但是没有进一步想到得正之后在进行一次比较class Solution {public:int maxProduct(vector& nums){ if (nums.size() == 0) return 0; if (nums.size() == 1) return nums[0]; int max_loc

2016-11-01 23:39:35 145

MongoDB_Architecture_Guide(MongoDB架构指导)(个人翻译版)

为了学习Mongodb自己翻译的材料

2017-05-01

Inside SQLite(SQLite技术内幕) 原版+个人翻译版

个人独立翻译的《Inside SQLite》。由于时间仓促,自己也是初学者,有许多地方实在是不尽如人意,最近比较忙,之后有时间的话会修订一次。欢迎任何形式的转载、修订。希望能和大家一起学习。

2016-10-14

opengl入门

两个初学opengl时做的小程序,分别实现正方形和正方体的旋转,都详细注释了,完全原创,希望帮助到学习opengl的人

2014-12-02

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除