- 博客(24)
- 资源 (4)
- 问答 (1)
- 收藏
- 关注
原创 Find K Pairs with Smallest Sums
原理如上图所示,最坏情况时间复杂度是k*klogk 参考了discuss的两份代码写了自己的代码 class Solution { public: class cell { public: int first; int second; int third; cell(int a, int b, int c) :first(a) , second(b) , third(c)
2016-09-30 18:23:48 249
原创 Mini Parser
自己逐字符判断,if、循环、迭代写了一大堆没通过,被一份使用C++字符流的代码吊起来打了 难点还是在流程控制部分,题不难 class Solution { public: NestedInteger deserialize(string s) { istringstream in(s); return deserialize(in); }
2016-09-29 17:01:34 195
原创 Random Pick Index
看到Each index should have equal probability of returning.第一反应就是水塘抽样算法,但是由于对这个算法的理解还是不深,所以没有深入地去想 自己遍历了一遍数组,找到target和它的重复之后用随机函数随机抽一个返回,但是随机函数都是用时间做种子的,for循环执行太快,一秒之内多次调用随机函数的话会导致输出不变(因为随机种子没变),解决方法是动态
2016-09-28 18:44:56 254
原创 Jump Game
思路偏了,想到了动态规划和dfs,但是时间复杂度很高,逻辑也不容易理清,用贪心就好 class Solution { public: bool canJump(vector& nums) { int reach = 0; //能到达的最远的地方 int i = 0; for ( ; i < nums.size() && i <= re
2016-09-27 22:51:35 125
原创 Course Schedule
判断有向图是否有回路 1.dfs,需要记录路径,每次向下搜索到一个节点后需要去路径中找是否出现过,太麻烦了,写了一个dfs的(没加路径记录),不能处理A->B->C,A->D->C这种情况 class Solution { public: class Node { public: int No; vector Next; int root = -1; Node(int x
2016-09-26 23:42:24 153
原创 Lowest Common Ancestor of a Binary Tree
dfs,第一次用了临时vector存储经过的路径,最后比较两个路径得到公共祖先节点,结果超过内存限制了,也是第一次遇到超过内存限制的情况,o(╯□╰)o 这是代码 class Solution { private: vector > res; public: TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNo
2016-09-25 09:57:29 145
原创 Palindrome Partitioning II
进入中级题部分后被虐的好惨QAQ 从后往前构造二维数组isPalin,用于存储已经确定的回文子串。isPalin[i][j]==true代表s[i,...,j]是回文串。 在构造isPalin的同时使用动态规划计算从后往前的最小切分数,记录在min数组中。min[i]代表s[i,...,n-1]的最小切分数。 (上述两步分开做会使得代价翻倍,容易TLE) 关键步骤: 1、min[i]
2016-09-24 11:03:40 158
原创 Palindrome Partitioning
暴力搜索寻找回文字符串(所有字符扫一遍),找到后用dfs做排列组合(这两步同时进行),空间复杂度时间复杂度双高,时间复杂度大概是O(n^2) Palindrome Partitioning II 的解法与这道题大体相同,只不过为了节省时间,用了DP来找回文字符串,比上面提到的找回文方法好一些 class Solution { public: vector > partition(string
2016-09-23 15:05:57 258
原创 Combination Sum II
昨天刚做了Permutations II,今天碰到相同的迭代格式就不会了,囧 主要还是一个dfs class Solution { public: void dfs(vector num, int start, int target, vector array, vector > &result) { if (target == 0) { result.push_back(arra
2016-09-22 16:07:37 141
原创 Permutations II
第一种方法(非递归) 算法的4个步骤和循环的退出条件我在注释中都写清楚了 class Solution { public: void swap(int &i, int &j) { int temp = i; i = j; j = temp; } vector > permuteUnique(vector &num) { vector> res; int i, j,
2016-09-21 16:44:58 176
原创 Unique Binary Search Trees II
1 3 3 2 1 \ / / / \ \ 3 2 1 1 3 2 / / \ \ 2 1 2 3 如上图所示,对于根节点,我们需
2016-09-20 12:41:14 180
原创 Construct Binary Tree from Preorder and Inorder Traversal
练习使用栈的方法,折腾了半天 囧 class Solution { public: TreeNode* buildTree(vector& preorder, vector& inorder) { if (preorder.size() == 0)return NULL; stack stak; TreeNode* res = new TreeNode(preorder[0]);
2016-09-18 10:58:18 192
原创 Number of Islands
一开始思路一直在边界上打转,没想到正确方法是把所有的island都变成0(即去除孤岛),在变的过程中计数 这里使用递归的方法 class Solution { public: int numIslands(vector > &grid) { int rows = grid.size(); if (rows == 0) { return 0; } int cols = g
2016-09-15 09:16:05 168
原创 3Sum Closest
先对数组排个序。枚举第一个数,然后设两个指针,在第一个数的后半段开始王中间收缩,if sum > target则右指针往左移, if sum 排序可以大大降低时间复杂度,和3sum那道题有点像,左右指针向中间收缩和木桶装水那道题有点像。 class Solution { public: int threeSumClosest(vector& nums, int target) { if
2016-09-14 09:34:48 153
翻译 Inside SQLite Section 1.1 应用实例
1.1应用实例 1.1.1一个简单的SQLite应用 #include #include "sqlite3.h" int main(void) { sqlite3* db = 0; sqlite3_stmt* stmt = 0; int retcode; retcode = sqlite3_open("MyDB", &db); /* Open
2016-09-14 08:55:11 787
原创 Construct Binary Tree from Inorder and Postorder Traversal
对于需要自底向上建树的情况,用循环不如用递归方便 递归的思路就是通过从后向前查找postorder来获取每个子树的根节点,找到根节点后去inorder中找到对应的值,用这个值把inorder分成两半,得到左右子树的大小,用得到的左右子树的大小再去分割postorder 这种方法太麻烦了,其实本质上说单独的一个inorder或者postorder就包含了用于构造一颗树的充足的信息,多给一个数组没
2016-09-12 10:51:03 248
原创 Unique Paths II
开始用dfs,超时 应该像Unique Paths一样用动态规划,只不过需要额外处理边界有障碍和内部有障碍的情况 没找到用二维dp数组的例子 下例对obstacleGrid的边界处理部分值得学习 class Solution { public: int uniquePathsWithObstacles(vector>& obstacleGrid) { // parameters ch
2016-09-11 10:45:30 162
原创 Ugly Number II
记录一下用Index代替list的思想,非常简洁,节省空间 class Solution { public: //求三个数的最小值 int min(int a, int b, int c) { int minNum = a > b ? b : a; return minNum > c ? c : minNum; } //求第N个丑数 int nthUglyNumber(int
2016-09-10 15:27:50 134
原创 UTF-8 Validation
按照UTF-8的定义多做几次判断就行,我在判断首byte的时候11000000和00001100这两种情况不好判断,即1在中间的时候不好计数,还是答案简洁: class Solution { public: bool validUtf8(vector& data) { int count = 0; for (auto c : data) {
2016-09-09 09:43:59 471
原创 Longest Substring with At Least K Repeating Characters
开始想到了用出现次数小于K的字符做分割符,觉得用map存储出现次数会增加lgn的时间复杂度,也顾忌分割之后每小段还会有出现次数小于K的字符出现,但是没能更进一步想到用用递归和哈希表来解决这两个问题。用递归的时候又蠢得没用分治,用了一颗多叉的递归树,导致分枝控制条件各种复杂,最后还是回归官方答案的分治法了QAQ class Solution { public: int longestSubstr
2016-09-08 09:29:04 269
翻译 Inside SQLite Chapter 1.概览
概览 过去的几十年中涌现了许多数据库管理系统(DBMSs),例如DB-2,Informix,Ingres,MySQL,Oracle,SQL Server,Sybase等。SQLite近几年才加入到DBMS的大家庭中,并且在商业应用上取得了成功。2000年5月9日,SQLite首次发布。该数据库是一个具有以下特性的关系型数据库: 无需配置(Zero configuration) 在使用SQ
2016-09-07 15:37:42 594
原创 Lexicographical Numbers
字典排序是按照10进制的各个位排的,我跑去排二进制的各个位去了,o(╯□╰)o 官方discuss的代码循环里if else剪枝设计的太精巧了,记录一下 class Solution { public: vector lexicalOrder(int n) { vector res(n); int cur = 1; for (int i = 0; i < n; ++i) {
2016-09-03 09:34:55 218
原创 Guess Number Higher or Lower II
看了半天还是似懂非懂,o(╯□╰)o 用了极小极大算法:在1-n个数里面,我们任意猜一个数(设为i),保证获胜所花的钱应该为 i + max(w(1 ,i-1), w(i+1 ,n)),这里w(x,y))表示猜范围在(x,y)的数保证能赢应花的钱,则我们依次遍历 1-n作为猜的数,求出其中的最小值即为答案 class Solution { public: int getMoneyAmount
2016-09-02 14:35:00 159
原创 Guess Number Higher or Lower
题意是如果给出的数比猜的数大,返回1,一开始理解错了 用二分法来做,mid = (left+right)/2这种写法行不通,因为int越界会导致死循环,改为mid = left + (right-left)/2 class Solution { public: int guessNumber(int n) { int left = 1; int right = n; int mi
2016-09-01 09:07:47 140
Inside SQLite(SQLite技术内幕) 原版+个人翻译版
2016-10-14
MFC用capCaptureGetSetup设置视频捕获遇到问题
2014-12-07
TA创建的收藏夹 TA关注的收藏夹
TA关注的人