- 博客(45)
- 资源 (28)
- 收藏
- 关注
原创 LeetCode基础--位运算(in progress)
Bitwise XORXOR(^) :异或,数学符号为 ^1^0 = 1 0^1 = 1 0^0 = 01^1 = 0 XOR by 1 可以像开发一样从 1 到 0 或者 从 0 到 1. 还有一个有意思的:x^0 = x x^x = 0应用 1:翻转数字 N 的所有二进制位。 解决方案:如果 N 是32位数字,则:N ^((1 << 32) - 1 )应用 2:不用运算符交换两
2017-11-29 15:24:23 353
原创 LeetCode基础--二叉树--反转左右子树
题目描述: 反转二叉树的左右子树。实现:public class Solution { public TreeNode InvertTree(TreeNode root) { if(root == null) { return null; } TreeNode tmp = root.left;
2017-11-29 14:37:31 1251
原创 LeetCode基础--二叉树-判断二叉树是否平衡
题目描述: 求二叉树是否平衡,即:左右子树的高度差小于等于1,实现:public class Solution { public bool IsBalanced(TreeNode root) { if(root == null) { return true; } int L = Depth(root.l
2017-11-29 14:26:48 387
原创 LeetCode基础--二叉树-求最小高度
题目描述: 求二叉树的最小高度.实现:public class Solution { public int MinDepth(TreeNode root) { if (root == null) { return 0; } int L = MinDepth(root.left); in
2017-11-29 14:14:20 1825
原创 LeetCode基础--二叉树-求最大高度
题目描述: 求二叉树的最大高度。代码实现:public class Solution { public int maxDepth(TreeNode root) { if(root == null) { return 0; } int left = 0, right = 0; left
2017-11-29 14:04:19 1365
原创 LeetCode基础--二叉树--ZigZag遍历
题目描述: ZigZag方式遍历二叉树,即:根->左子->右子->右子的左子->右子的右子->XXX 实现:public class Solution { public IList<IList<int>> ZigzagLevelOrder(TreeNode root) { IList<IList<int>> result = new List<IList<int>>();
2017-11-29 13:59:04 1134
原创 LeetCode基础--二叉树--判断是否为BST
递归实现:public class Solution { public bool IsValidBST(TreeNode root) { return isValidBST(root, long.MinValue, long.MaxValue); } private bool isValidBST(TreeNode root, long minVal, lon
2017-11-27 16:49:21 1211 1
原创 LeetCode基础--二叉树--中序遍历
中序: 左->根->右递归实现:public class Solution { public IList<int> PreorderTraversal(TreeNode root) { List<int> result = new List<int>(); if (root != null){ result.AddRange(Preor
2017-11-27 15:23:43 564
原创 LeetCode基础--二叉树--后序遍历
前序: 左->右->根递归实现:public class Solution { public IList<int> PreorderTraversal(TreeNode root) { List<int> result = new List<int>(); if (root != null){ result.AddRange(Preor
2017-11-27 15:18:08 276
原创 LeetCode基础--二叉树--前序遍历
前序: 根->左->右递归实现:public class Solution { public IList<int> PreorderTraversal(TreeNode root) { List<int> result = new List<int>(); if (root != null){ result.Add(root.val);
2017-11-27 11:21:13 1532
原创 LeetCode基础--二叉树-判断两个树是否相同
实现:public class Solution { public bool IsSameTree(TreeNode p, TreeNode q) { if(p == null && q == null) { return true; } if(p == null || q == null)
2017-11-27 10:43:05 705
原创 LeetCode基础--二叉树--层次遍历
题目描述:思路:实现:public class Solution { public IList<IList<int>> LevelOrder(TreeNode root) { Queue<TreeNode> queue = new Queue<TreeNode>(); var result = new List<IList<int>>();
2017-11-26 22:35:42 452
原创 LeetCode基础--二叉树-判断是否对称
题目描述: 判断一个二叉树是否左右对称,比如: 1 / \ 2 2 / \ / \ 3 4 4 3思路: 对称的条件是:左子树的左子结点等于右子树的右子结点,并且左子树的右子结点等于右子树的左子结点。递归实现:public class Solution { public bool IsSymmetric(TreeNode root) {
2017-11-26 20:46:59 1088
原创 LeetCode基础--二叉树
二叉树的数据结构定义:public class TreeNode { public int val; public TreeNode left; public TreeNode right; public TreeNode(int x) { val = x; }}二叉树题型:二叉树前序遍历二叉树中序遍历二叉树后序遍历二叉树层次遍历二叉树ZigZa
2017-11-26 20:35:31 319
原创 LeetCode基础--Union Find(Disjoint Set)
Union Find,也叫作 Disjoint Set,中文通常译作 “并查集”。 Union Find 有两种操作:Union 和 Find,即“连接”和“查找”。并查集用于:一个集合被分成几组的情况,集合中的每个数据只属于一个单独的组,无向图的连通分量就是这样一个例子。如下图: 1~9 的集合中的 3 个连通分量,或者说 3 个 Disjoint Set。Disjoint Set 数据结构可
2017-11-25 19:39:48 1396
原创 LeetCode基础--动态规划
动态规划:dynamic programming,是用过去的知识解决未来的问题。动态规划常用于字符串问题,可以通过解决原始问题的子问题,然后用这个子问题的结果来解决更复杂的原始问题。 通常把子问题的结果存放在一个一维或二维数组中,然后在需要时查询。动态规划还可以用在递归问题中,以避免重复地计算同一个子问题。 比如 Fibonacci 数列问题,Fn = Fn-1+ Fn-2 而 F0 = 0,
2017-11-23 23:50:51 346
原创 LeetCode 解题
题目序列: 序号 标题 技术点 1 Two sum HashMap 2 Add two numbers 链表 3 Longest Substring Without Repeating Characters HashSet 4 Median of Two Sorted Arrays 5 6 7
2017-11-19 13:48:44 312
原创 LeetCode解题-#20-Valid Parentheses
题目描述: 给一个只包含”(“, “),”, “[“, “]”, “{“, “}” 的字符串,判断这个字符串是否有效(配对)。 比如: “()[]{}” 是有效的。 “([)]” 是无效的。思路: 让 3 种括号能有效的原则要依次配对,左开口的 3 种扩号是 :”(“, “[“, “{“, 右开口的 3 种扩号是 “)”, “]”, “}”, 要让左右都配对,那就必须保证右开口扩号
2017-11-19 13:23:44 249
原创 LeetCode解题-#53-Maximum subarray problem
题目描述: 找出一个 int 数组中的最大子数组的和。(数组长度 >= 1) 比如: [-2,1,-3,4,-1,2,1,-5,4] 的最大子数组是 [4,-1,2,1] 和是 6思路: 表面上这是一个最优化问题(optimization problem),可以试着用 DP 去解。DP 的第一步就是找出子问题: maxSubArray(int A[], int i, int
2017-11-19 00:15:46 256
原创 LeetCode解题-#14-Longest Common Prefix
题目描述: 找出一组字符串中的最长共同前缀。分析: 例如 abc, abd, ab,它们的最长共同前缀是 ab。思路: 学习过的 Trie 刚好能解决这个问题,虽然不会是最优解,但可以练练手。 Trie:http://blog.csdn.net/cuit/article/details/78495561先定义好 Trie 树 的数据结构: 这里用 HashMap(C#中是 Dictiona
2017-11-16 22:45:10 241
原创 LeetCode解题-#9-Palindrome Number
题目描述: 判断一个数字是否是回文,不可以用额外的空间。分析: 题目的初衷是不想答题者转换成字符串再判断是否是回文。可是即使不用字符串,也不可能完全做到不用额外的空间的,还不如直接明说了限制。 另外,负数,0 结尾的数字,是无论如何也不会成为回文的。思路: 可以先把数字逆序,再比较原数字和逆序后的数字是否相同,相同则是回文。 但是如果完全逆序则有可能导致overflow,所以只能逆序半截
2017-11-13 00:40:34 249
原创 LeetCode解题-#7-Reverse Integer
题目描述: 给一个32位有符号整数,按位反转。 如果溢出则返回0。 比如: Input: 123 Output: 321 Input: -123 Output: -321 Input: 120 Output: 21思路: 第一反应是转换成 string,再反转,但这肯定不是最高效的。 可以从右向左按位逐个取出数字,保存进一个新的数字。 比如: 12
2017-11-11 22:09:50 242
原创 LeetCode解题-#4-Median of Two Sorted Arrays
题目描述: 找出两个排序数组 nums1(长度为m), nums2(长度为n) 的中值。要求时间复杂度为O(logm+n)。 中值的定义:如果数组有偶数个,则中值是最中间两个数的平均值,如果数组有奇数个,则中值就是最中间那个数。 例1: nums1 = [1, 3] nums2 = [2] The median is 2.0 nums1 = [1, 2] nu
2017-11-11 14:24:50 318
原创 LeetCode解题-#3-Longest Substring Without Repeating Characters
题目描述: 给出一个字符串,找出最长不重复的子串(连续的)。比如: Given “abcabcbb“, the answer is “abc“, which the length is 3. Given “bbbbb“, the answer is “b“, with the length of 1. Given “pwwkew“, theanswer is “wke“, wi
2017-11-11 14:16:34 227
原创 LeetCode解题-#2-Add two numbers
题目描述: 有两个非空链表,分别表示一个非负整数,位数是逆序的,比如: 2->4->3 分别是个位,十位,百位。结果仍然是一个表示非负整数的链表。 Input: (2 -> 4 -> 3) + (5 -> 6 -> 4) Output: 7 -> 0 -> 8思路: 因为结果仍然是位数逆序的,所以只需要像加法运算一样,从左到右依次相加两个链表即可。要注意的是:两个链表位置不相等
2017-11-11 12:42:39 294
原创 LeetCode解题-#1-Two sum
题目描述: 给出一个数组 nums,找出其中两个和为 target 值的元素的索引,注意:有且只有一对值符合要求。如: Given nums = [2, 7, 11, 15], target = 9, Because nums[0] + nums[1] = 2 + 7 = 9, return [0, 1].思路:第一反应会去暴力双重循环地判断 nums[0] + nums[i
2017-11-11 11:46:04 259
原创 LeetCode基础-字符串-Trie
Trie 来自单词 retrieval,发音为 try(避免与tree混淆),也叫做 单词查找树,或 字典树。 Trie 是树结构,除根结点外,每个结点都只会有一个父结点。每个结点都有 R 个子结点, R 是字母表的大小,而且可能含有大量的空结点。假设有字符串:“she sells sea shells by the sea shore”,可以保存成下面这样,让根结点为空:我们将每个 字符串 关联
2017-11-10 00:24:36 385
原创 LeetCode基础-图-有向图-Dijkstra算法(未完成)
Dijkstra 算法用于解决 边权重非负、加权有向图、单起点最短路径 问题。 Dijkstra 算法与在加权无向图中查找最小生成树的方法类似:每一步添加一个非树顶点到树中,直到所有顶点都在树中。
2017-11-09 22:11:03 969
原创 LeetCode基础-图-有向图-最短路径
最短路径:从图中的一个顶点到另一个顶点的成本最小的路径。 单点最短路径:在加权有向图中,给出一个起点 s,找到是否有一条到顶点 v 的路径,如果有,找出权重最小的那条。最短路径的性质:路径是有向的。权重不定表示距离。并不是所有顶点都是可达的。负权重会使问题变复杂。最短路径一般都是简单的(不含零权重边的环)。最短路径不定是唯一的。可能存在平行边和自环。平行边中权重最小的才会被选中。也
2017-11-09 09:07:52 7563
原创 LeetCode基础-图-最小生成树
加权图:为每条边关联一个权值或者说成本的图模型。 图的生成树:含有图的所有顶点的无环连通子图。 最小生成树:加权无向图的最小生成树(MST)是它的一棵权值最小(所有边的权值之和)的生成树。 下图是加权无向图与它的最小生成树。最小生成树有两个经典算法:Prim 算法Kruskal 算法如果一幅图是非连通的,则只能用这个算法计算所有连通分量的最小生成树,合并在一起叫做最小生成森林。还有几点要
2017-11-08 23:53:11 4841 1
原创 LeetCode基础-图-有向图-强连通性
在有向图中,如果两个顶点 v 和 w 是互相有向的,则称它们是强连通的。 在有向图中,如果任意两个顶点都是互相有向的,则称这幅图是强连通图。 所以有以下命题:任意顶点 v 和自身也是强连通的。如果 v 和 w 强连通的,则 w 和 v 也是强连通的。如果 v 和 w 强连通,w 和 x 强连通,则 v 和 x 也是强连通的。强连通性将所有顶点分成了一些平等的部分,每个部分都是由 相互为
2017-11-08 22:48:05 1265
原创 LeetCode基础-图-有向图-拓扑排序
**拓扑排序**拓扑排序:给一幅有向图,把所有的顶点排序,使所有的有向边都从 排在前面的顶点 指向排在后面的顶点。(或者证明不能做到,比如有环) 拓扑排序可以用来解决优先级调度的问题。(前后顶点有依赖关系) 比如下面的课程学习顺序:比如 任务x 必须在 任务y 之前完成, 任务y 必须在 任务z 之前完成,但 任务z 必须在 任务x 之前完成,这肯定是图中有环,这样就无法完成拓扑排序了。所有首先
2017-11-08 22:22:33 934
原创 LeetCode基础-图-有向图
在有向图中,边是单向的。**术语**:出度:在有向图中,一个顶点的出度为该顶点指出的边的总数。 入度:在有向图中,一个顶点的出度为指向该顶点的边的总数。 表示:用 v->w 来表示 一条由 v 指向 w 的边。v 与 w 也可能是双向的。类的代码:public class Digraph{ private final int V; private int E; priv
2017-11-08 09:15:11 918
原创 LeetCode基础-图-连通分量
在无向图G中,若从顶点 v 到顶点 w 有路径(当然从vj到vi也一定有路径),则称v和 w 是连通的。 若图 G 中任意两个不同的顶点 v 和 w 都连通(即有路径),则称G为连通图。 无向图 G 的极大连通子图称为 G 的最强连通分量。任何连通图的连通分量只有一个,即是其自身。非连通的无向图有多个连通分量。可以用 DFS 查找所有连通分量:class CC { private
2017-11-07 00:12:58 1960
原创 LeetCode基础-图-BFS
BFS:Breadth First Search,广度优先搜索。 当有这样一个问题:计算图中两点之间的最短距离时,需要广度优先搜索,BFS 也是很多图算法的基石。要找到顶点 s 到 顶点 v 的最短路径,从 s 开始,在所有距离 s 一条边的顶点中寻找 v,如果找不到,就继续在与 s 距离一条边的顶点中寻找 v,如此下去,走到找到 v。深度优先搜索就好像是一个人在走迷宫,而广度优先搜索就像是一组人
2017-11-06 23:42:32 470
原创 LeetCode基础-图-DFS
DFS:Depth First Search,深度优先搜索。走迷宫的过程:选择一条没有标记过的通道,在走过的路上铺一条绳子。标记所有你第一次路过的路口和通道。当到达一个标记过的路口时(用绳子)回退到上个路口。当回退到的路口已经没有可走的通道时继续回退。 绳子可以保证你总能找到一条出路,标记则能保证你不会两次经过同一条通道或同一个路口。深度优先遍历的具体实现思路是:用一个递归方法遍历所有顶
2017-11-05 22:59:09 573
原创 LeetCode基础-图-无向图
无向图:Undirected Graphs图由 边(Edge) 和 顶点(Vertex) 组成:一般用 0 到 V-1 来表示 V 个顶点组成的图中的各个顶点。 一般用 v-w 来表示连接顶点 v 到 顶点 w 的边。图相关术语特殊的图:自环:有一条边连接一个顶点和其自身。英文称作:self-loop。平行边:有两条边连接同样的同个顶点。英文称作:parallel。多重图:含有平行边的图
2017-11-05 14:44:34 2117
原创 LeetCode基础-图
图的定义: 由一组顶点(Vertex)和一组能够连接做任意两个顶点的边(Edge)的集合组成。图的应用:地图:比如两点之间的最短路径。网页信息:比如多个页面之间的引用关系。电路:元件之间的连接关系。任务调度:比如最少的时间完成有依赖关系的工序调度。商业交易:比如表示现金和商品在买卖双方之间的转移,以理解对市场的理解。配对:学生与各种社团之间的关系。一个学生可能参与多个社团。计算机网络
2017-11-05 13:36:28 371
原创 LeetCode--LRU Cache
LRU == Least Recently Used. LRU 的内部继承于 LinkedHashMap。LRUCache 将元素按照访问的先后顺序保存在一条双向链接中,并保存指向开头和结尾的指针。将元素作为key,元素在链接中的位置作为value 保存起来。LRU 的两种操作:Get:将它从链表中删除,并插入链表的头部。Delete:将它从尾部删除。Android 中的 LRUCache
2017-11-05 00:32:05 248
原创 LeetCode基础-查找-HashTable
假设待查找的对象是这样存在的:[key1, value1], [key2, value2], [keyX, valueX], … 我们可以把key的列表转过转化存入HashTable中。 使用基于HashTable的查找需要两步:用 Hash 函数将所有 key 都转化为数组的索引(整数)。如果多个 key 转化成为同一个数组的索引,则需要解决碰撞(collision-resolution)。
2017-11-04 22:06:59 582
UnityVirtualRealityProjectsSampleCode
2016-12-23
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人