- 博客(16)
- 资源 (4)
- 问答 (1)
- 收藏
- 关注
原创 Linked List Random Node
水塘抽样算法:关键点是不知道样本总大小,抽样要等概率算法过程:遍历一遍链表,每遍历到一个元素时记当前元素编号为n,生成随机数,若随机数小于1/n,则令该元素作为结果,这样进行下去,遍历到最后得到的结果的被抽取概率就是1/N,也就能保证所有元素都是等概率抽取的。参考公式为:
2016-08-31 09:42:53 172
原创 Super Pow
前提知识: ab % k = (a%k)(b%k)%k对b做二分处理,即 (a^b) % k = (a * a)^(b/2) % k,这样时间复杂度就是logb了当然还要处理b是奇数的情况,而且b在这道题里是个数组,所以要写一些针对数组的运算函数class Solution {public: int superPow(int a, vector& b) { int an
2016-08-30 09:48:54 340
原创 Triangle
方法1:dfs,时间复杂度是指数,排除方法2:采用有向图求最短路径的方法,每个元素是一个节点,边的权值等于两个节点的值的和,把所有元素用邻接表存起来,设三角形最后一行有c个数,那么分别以这c个数作为路径寻找的终点,做c次dijkstra,得到c个最短路径,再在c个最短路径中找一个最小的,这个最小的值就是答案,这种方法的时间复杂度是O(cn),就是操作起来太麻烦。方法3:动态规划,dp数组用
2016-08-29 09:01:16 337
原创 Largest Divisible Subset
说是动态规划,其实就是遍历数组,(虽然我没做出来QAQ)每遍历一个的时候都要向前遍历一次找到所有的能整除的 class Solution { public: vector largestDivisibleSubset(vector &nums) { if (nums.size() == 0) { return vector{}; } sort(nums.begin(),
2016-08-27 15:19:17 314
原创 Subsets II
方法1:按照Subsets I 的方法做,解出子集后去重方法2:前一部分的解题思路和Subsets I一样,对于重复的元素,记录每个数字重复出现的次数,进行组合,例如对于1,2,2,由于2出现了两次,所以可能的组合是不选2,选一个2,选两个2,这样得到的结果就是 空集; 1 ; 2,; 1,2 ; 2,2; 1,2,2; class Solution {public
2016-08-24 09:24:06 140
原创 Flatten Binary Tree to Linked List
记录一下,虽然是树的结构,但是要求in-place,要联想到链表翻转之类的题,因为要原地进行,所以解决方法是操作各种指针指向,一般会声明几个额外指针存储遍历时的临时变量。class Solution {public: void flatten(TreeNode* root) { if(!root) return; TreeNode* curr = ro
2016-08-21 09:22:05 140
原创 Search in Rotated Sorted Array II
Search in Rotated Sorted Array I 和Search in Rotated Sorted Array II我都用了线性搜索,都AC了,速度还非常快,o(╯□╰)o在这里记录一下网上用二分法解的:分情况讨论,数组可能有以下三种情况:然后,再看每一种情况中,target在左边还是在右边。class Solution { int sear
2016-08-20 09:24:44 198
原创 Combination Sum
剪枝要去掉排序不同但是组合相同的集合。class Solution {public: vector> combinationSum(vector& candidates, int target) { vector> res; vector process; sort(candidates.begin(), candidates.end());//为剪枝做准备,思想是顺序扫can
2016-08-18 09:14:54 130
原创 H-Index II
二分查找:注意每次循环边界的选取.class Solution {public: int hIndex(vector& citations) { int len = citations.size(), left = 0, right = len - 1; while (left <= right) { int mid = 0
2016-08-17 08:42:30 194
原创 Verify Preorder Serialization of a Binary Tree
给的字符串是二叉树dfs搜了一遍的结果,也就是先序遍历的结果。当出现叶节点时,就会出现两个"#",因为叶节点没有子节点。此时可以将该叶节点消除,即用一个"#"代替,一层层向上归并消除直至根节点,最终只剩一个"#"。由于字符串操作不方便,所以转化成vector,vector中的0代表'#',1代表有value。class Solution {public: bool isValidSeria
2016-08-15 09:51:03 146
原创 Subsets
可以发现S=[1, 2] 的解就是 把S = [1]的所有解末尾添上2,然后再并上S = [1]里面的原有解。class Solution {public: vector> subsets(vector& nums) { vector > res; vector emp; res.push_back(emp); sort(nums.begin(), nums.end());
2016-08-13 10:11:34 150
原创 Perfect Squares
动态规划:dp[x + y * y] = min(dp[x + y * y], dp[x] + 1)class Solution {public: int numSquares(int n) { vectordp(n+1); for (int i = 1; i * i <= n; i++) { dp[i * i] = 1; } fo
2016-08-10 10:00:01 131
原创 Combination Sum IV
第一种方法:dfs遍历,时间复杂度(nums.size())^target,超时class Solution {public: int combinationSum4(vector& nums, int target) { int count = 0; dfs(nums,0,count,target); return count;
2016-08-09 09:45:23 162
原创 Set Matrix Zeroes
压榨空间复杂度的题需要思考把中间信息放到输入的无用空位中,这样就能节约额外空间了。本题需要把清零的信息存储在输入矩阵的第一行和第一列中: class Solution { public: void setZeroes(vector > &matrix) { const int ROW = matrix.size();
2016-08-06 08:40:42 169
原创 "Sum of Two Integers" and "Sort Colors"
Sum of Two Integers这里用到了一个半加法的思想, 即两位单独的位相加其结果可以用异或得到, 进位可以用与得到. 举个例子: 11+5, 其二进制形式为11: 1011, 5: 01011. 那么两个位置都为1的地方就需要进位, 所以进位值就为0001. 原位置两个数相加的结果为那个位置值的异或即1110. 2. 接下来就要把进位位和下一位相加, 所以进位值左移
2016-08-01 09:07:27 173
Inside SQLite(SQLite技术内幕) 原版+个人翻译版
2016-10-14
MFC用capCaptureGetSetup设置视频捕获遇到问题
2014-12-07
TA创建的收藏夹 TA关注的收藏夹
TA关注的人