- 博客(71)
- 资源 (18)
- 收藏
- 关注
原创 LeetCode 查找 Search a 2D Matrix
思想:方法一:先确定该元素可能在的行,再在该行找该元素。时间复杂度O(max(m,n))。class Solution {public: bool searchMatrix(vector > &matrix, int target) { int m = matrix.size(); int n = matrix[0].size();
2015-04-29 12:53:49 414
原创 模拟 Jump Game
思想:每次更新所能到达的最远位置,最后看是否大于等于最后一个元素的位置。class Solution {public: bool canJump(vector& nums) { int reach = 0; for(int i=0; i<=reach && reach<nums.size()-1; i++) { reach
2015-04-29 12:24:46 374
原创 LeetCode 数组 Set Matrix Zeroes
思想:提示说明,最好的方法空间复杂度为O(1),其次空间复杂度为O(m+n),最坏的是O(m*n)。方法一:O(m*n) space开一个二维数组记录每一位置是否为空。方法二:O(m+n) space开两个一维数组,一个代表该行是否为空,一个代表该列是否为空;class Solution {public: void setZeroes(vector
2015-04-29 11:21:30 383
原创 LeetCode 模拟&栈 Simplify Path
思想:模拟栈,只保存路径(目录)名字;对于“.”,跳过;对于“..”,若不为空,弹栈;class Solution {public: string simplifyPath(string path) { vector stack; for(auto i=path.begin(); i!=path.end();) {
2015-04-29 10:13:54 409
原创 DP Minimum Path Sum
思想:方法一:DP状态方程:f[i][0] 可以提前求出; 0 f[0][i] 可以提前求出; 0 f[i][j] = min( f[i-1][j], f[i][j-1]) + grid[i][j];class Solution {public: int minPathSum(vector > &grid) { int m = grid.s
2015-04-28 22:18:54 410
原创 DP Unique Paths II
思想:方法一:DP类似上一题,这里直接用滚动数组实现。时间复杂度O(n^2),空间复杂度O(n)。注意初始map[0] = 1,针对map[0],当obstacleGrid[0][j]有1个的等于1时(有障碍),下面所有的map[0]都为0(无路径可达)。class Solution {public: int uniquePathsWithObstacles(vector
2015-04-27 20:36:06 439
原创 DP Unique Paths
思想:方法一:DP时间复杂度O(n^2),空间复杂度O(n^2)递推方程:map[0][i] = 1; 0map[i][0] = 1; 0map[i][j] = map[i-1][j] + map[i][j-1]最后结果 = map[i-1][j-1]class Solution {public: int uniquePaths(int m, int
2015-04-27 13:17:41 423
原创 编程之美 八卦的小冰
小数据AC,大数据TLE。。。题目3 : 八卦的小冰时间限制:2000ms单点时限:1000ms内存限制:256MB描述小冰是个八卦的人,最近她对一个社交网站很感兴趣。由于小冰是个机器人,所以当然可以很快地弄清楚这个社交网站中用户的信息啦。她发现这个社交网站中有N个用户,用户和用户之间可以进行互动。小冰根据
2015-04-27 12:39:45 998
原创 编程之美 扑克牌
小数据AC,大数据TLE。。。题目1 : 扑克牌时间限制:2000ms单点时限:1000ms内存限制:256MB描述一副不含王的扑克牌由52张牌组成,由红桃、黑桃、梅花、方块4组牌组成,每组13张不同的面值。现在给定52张牌中的若干张,请计算将它们排成一列,相邻的牌面值不同的方案数。牌的表示方法为XY,其中X为
2015-04-27 12:36:59 1804
原创 链表 Rotate List
思想:翻转的意思就是留下最右面的K个节点,剩下的都翻到后面去。将首、尾节点相连;求出要翻转的节点个数k;尾节点向后移动k个节点;断开节点;注意的是k可能大于链表长度len,若这样,取摸后的值就是从后往前要留下的节点的个数,其余的翻转到右面去。/** * Definition for singly-linked list. * struct ListNode
2015-04-27 10:43:03 442
原创 细节&数组 Spiral Matrix II
思想:跟上题思路一样。注意用vector创建二维数组时候指定维数的方法:vectorvectorint>> res(n,vectorint>(n));class Solution {public: vector > generateMatrix(int n) { vector> res(n,vector(n));
2015-04-26 10:55:02 432
原创 编程之美 质数相关
题目3 : 质数相关时间限制:2000ms单点时限:1000ms内存限制:256MB描述两个数a和 b (a输入第一行为一个数T,为数据组数。之后每组数据包含两行。第一行为N,为集合S的大小。第二行为N个整数,表示集合内的数。输出对于每组数据输出一行,形如"Case #X: Y"。X为数据编号,从1开始,Y为最
2015-04-25 23:27:36 940
原创 编程之美 彩色的树
题目1 : 彩色的树时间限制:2000ms单点时限:1000ms内存限制:256MB描述给定一棵n个节点的树,节点编号为1, 2, …, n。树中有n - 1条边,任意两个节点间恰好有一条路径。这是一棵彩色的树,每个节点恰好可以染一种颜色。初始时,所有节点的颜色都为0。现在需要实现两种操作:1. 改变节点x的颜色为y;2. 询问整
2015-04-25 23:27:03 867
原创 LeetCode Spiral Matrix 细节&数组
思想:一步一步进行判断,从左往右,从上到下,从右往左,从下到上。class Solution {public: vector spiralOrder(vector > &matrix) { vector res; if(matrix.empty()) return res; int beginX = 0, endX = matrix
2015-04-25 11:42:07 387
原创 贪心 Jump Game II
思想:上一题用reach表示每一跳最远到达的位置,但是每一跳都按最远的跳不一定是最优路径(最少步数)。但是有一个是很确定的:如果当前位置超出了上一次算出的最远所能到达的位置reach,就必须step++,所以这里用一个range来记录上一次算出的最远所能到达的位置,即到了不得不跳的时候必须跳。时间复杂度O(N),空间复杂度O(1)。class Solution {pu
2015-04-25 11:00:55 482
原创 DP Jump Game
思想:如果nums[i]!=0,class Solution {public: bool canJump(vector& nums) { int reach = 0, i; for(i=0; i<nums.size(); i++) { if(i == nums.size()-1) return true;
2015-04-24 21:38:25 497
原创 LeetCode Maximum Subarray DP
思想:时间复杂度O(N),空间复杂度O(1)。从头到尾遍历,如果nums[i]比前面的子序列和大,则从nums[i]重新开始新的子序列,否则,加入nums[i]并延续前面的子序列。res取所有这些子序列中最大的。class Solution {public: int maxSubArray(vector& nums) { int res = INT
2015-04-24 20:44:47 432
原创 二分法 Pow(x, n)
思想:二分法。如果n是奇数,x^n = x^(n/2) * x^(n/2) * x ;如果n是偶数,x^n = x^(n/2) * x^(n/2) ;class Solution {public: //Pow(x, n) double func(double x, int n) { if(n == 0) return 1;
2015-04-24 17:34:17 697
原创 字符串 Anagrams
思想:题意是如果给定串中包含anagram,返回所有的anagram。什么是anagram?举个例子:teach和cheat就是一组Anagrams,它们都包含相同的字母a、c、e、h、t。所以规律就是:如果串a和串b的字典序列相同,则它们就构成一组Anagrams。用unordered_map,key为字典序列,value为一系列对应的Anagrams。class
2015-04-24 17:03:33 743
原创 取反 Single Number
思想:1^1 == 0 is true.class Solution {public: int singleNumber(vector& nums) { int i,result=nums[0]; for(int i=1;i<nums.size();i++) { result = result^nums[i];
2015-04-23 22:08:48 448
原创 DFS Permutations II
思想:此题允许序列中又重复的元素。一个判定规则:(先排序)如果num[i-1] == num[i] 且 前面的那个数还没有用过的话,则说明这样下去必定会产生重复的排列。因为进入下一深度,必然会用num[i-1],就形成了num[i],num[i-1]这样的情形,跟先前已经有的num[i-1],num[i]是重复的序列。class Solution {pub
2015-04-23 21:53:55 541
原创 DFS Permutations
思想:DFSclass Solution {public: //Permutations void dfs(vector> &res, vector num, vector &path) { if(path.size() == num.size()) { res.push_back(path); re
2015-04-23 20:32:23 584
原创 LeetCode Combination Sum II DFS
思想:与上一题相比多了previous,即如果前面的这一层已经试验过了该数,就跳过它。class Solution {public: //Combination Sum II void dfs(vector num, int target, int pos, vector &value, vector> &res) { if(target == 0
2015-04-23 19:26:01 450
原创 LeetCode Combination Sum DFS
思想:DFS。由于每个字符可出现的次数不限,所以首先对数据集这里进行了排序,每一次往下一层前进的时候,起点还是i,直到不能前进,回退,i++。class Solution {public: //Combination Sum void dfs(vector &candidates, int target, int start, vector &value, v
2015-04-23 16:47:18 633
原创 字符串 Substring with Concatenation of All Words
思想:给定s,找符合条件的串s',该s'包括给定words中的每一个word且仅包含1次,不包含其他字符,返回若干个s'的起始位置。学习unordered_map:unordered_map是一种无序的、键值对应的哈希容器。允许通过key快速索引value,不允许多个value对应到同一个key。构造函数:unordered_map(unordered_map t)
2015-04-23 16:18:33 493
原创 K链表合并 Merge k Sorted Lists
思想:分布式常见题型。刚开始的思路:逐一合并,合并的时间复杂度用O(N) ——> TLE ListNode *mergeKLists(vector &lists) { if( lists.size() == 0) return nullptr; ListNode *p = lists[0]; for(int i=1; i <
2015-04-20 20:05:50 3980
原创 DFS Generate Parentheses
思想:DFSclass Solution {public: //Generate Parentheses void generate(vector &res, string s, int n, int l, int r) { if(l==n) { s.append(n-r, ')');//add n ')'
2015-04-20 17:08:33 422
原创 DFS Letter Combinations of a Phone Number
思想:DFSclass Solution {public: const vector dict={"","","abc","def","ghi","jkl","mno","pqrs","tuv","wxyz"}; void dfs(string digits, int depth, string path, vector &res) {
2015-04-20 15:40:33 553
原创 数组 Integer to Roman
思想:罗马数字基本规则:#1 基本字符罗马数字IVXLCDM阿拉伯数字1510501005001000#2 相同的数字连写,所表示的数等于这些数字相加得到的数,如:Ⅲ = 3;#3 小的数字在大的数字的右边,所表示的数等于这些数字相加得到的数, 如:Ⅷ = 8;Ⅻ = 12;
2015-04-20 14:48:03 297
原创 数组 Container With Most Water
思想:start初始指向0,end指向size-1;若height[start]短,start++;若height[end]短,end--;即每次刷新最短的隔板。class Solution {public: int maxArea(vector& height) { int start = 0; int end = heigh
2015-04-20 14:07:28 355
原创 最长回文子串 Longest Palindromic Substring
思路:方法一:暴力,时间复杂度O(n^3),空间复杂度O(1)不断判断子串是否回文。//Longest Palindromic Substringstring longestPalindrome(string s) { int length=s.size(); int maxLength=1; int start=0; for(int i=0;i<le
2015-04-19 11:17:38 483
原创 数学技巧 ZigZag Conversion
思想:关键是归纳出元素出现位置的公式。比如 nRows =4 的情形需要下面这样的分布:第0行:0 + + 6 + + 12第1行:1 + 5 7 + 11 第2行:2 4 + 8 10第3行:3 + + 9 (1)对于 第0行 && 第3行(最后一行):出现的元素在原串的位置依次是:0,6,12规律是:0,0+2*nRows-2=6,6+2*nRows-
2015-04-14 21:17:02 916
原创 字符串 Longest Substring Without Repeating Characters
思想:题意是 在原串中找到最长的一组每个字符最多出现一次的子串。方法是使用双指针在原串中进行扫描,时间复杂度O(n)。i表示满足条件的串的起始位置;j表示满足条件的串的结束位置;在一次遍历过程中记录长度最长的串的长度到maxLen中;j每次往前移动一单位,遇到一个新的字符,判断当前集合中是否已经存在该字符(1)若存在,移动i指针,直到排除之前出现过的这个元素;(2)
2015-04-13 22:23:11 333
转载 Ubuntu下包含2种远程桌面的方式:VINO-Server以及VNC Server
本文转自:其中Vino-Server是Ubuntu自带的远程桌面服务器,也就是在系统(System) —> 首选项(Preferences) —> 远程桌面(Remote Desktop)下,可以很容易开启,然后就可以使用VNC Viewer进行远程桌面连接。具体开通办法,可以参见《Ubuntu下开启远程桌面的方法》。不过,这种自带的Vino-Server方式有一个最显著的缺点
2015-04-13 16:32:41 996
原创 链表 Add Two Numbers
思想:注意细节。/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode(int x) : val(x), next(NULL) {} * }; */class Solution {public:
2015-04-12 17:02:57 502
原创 树 Path Sum
方法一:迭代,BFS。为每个节点保存一个从root到当前节点的sum和,若到了叶子节点,比对该sum和与给定的sum是否相等。/** * Definition for binary tree * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode(i
2015-04-12 14:46:06 483
原创 树 Minimum Depth of Binary Tree
思想:root为空,返回0;只有root节点,返回1;root左子树为空,返回右子树深度+1;root右子树为空,返回左子树深度+1;否则,返回左子树和右子树的最小者再+1;/** * Definition for binary tree * struct TreeNode { * int val; * TreeNode *left; *
2015-04-12 11:27:24 398
原创 树 Balanced Binary Tree
思想:每一节点的左支和右支的深度和不能超过1;每一节点(作为它父节点的左支或右支)都有一个深度值要返回,以便在其父节点进行平衡判断;/** * Definition for binary tree * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; *
2015-04-11 21:46:51 393
原创 树 Maximum Depth of Binary Tree
这里的深度是指一支上最多的节点个数。/** * Definition for binary tree * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode(int x) : val(x), left(NULL), right(NULL) {} *
2015-04-11 21:26:23 277
原创 树 Symmetric Tree
方法一:递归/** * Definition for binary tree * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode(int x) : val(x), left(NULL), right(NULL) {} * }; */clas
2015-04-11 21:12:45 316
庖丁解牛中文分词工具
2014-03-25
简易记事本
2012-04-14
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人