LeetCode
文章平均质量分 68
gnimgnot
这个作者很懒,什么都没留下…
展开
-
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 · 313 阅读 · 0 评论 -
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 · 1830 阅读 · 0 评论 -
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 · 389 阅读 · 0 评论 -
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 · 1369 阅读 · 0 评论 -
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 · 1136 阅读 · 0 评论 -
LeetCode基础-图
图的定义: 由一组顶点(Vertex)和一组能够连接做任意两个顶点的边(Edge)的集合组成。图的应用:地图:比如两点之间的最短路径。网页信息:比如多个页面之间的引用关系。电路:元件之间的连接关系。任务调度:比如最少的时间完成有依赖关系的工序调度。商业交易:比如表示现金和商品在买卖双方之间的转移,以理解对市场的理解。配对:学生与各种社团之间的关系。一个学生可能参与多个社团。计算机网络原创 2017-11-05 13:36:28 · 373 阅读 · 0 评论 -
LeetCode基础-图-无向图
无向图:Undirected Graphs图由 边(Edge) 和 顶点(Vertex) 组成:一般用 0 到 V-1 来表示 V 个顶点组成的图中的各个顶点。 一般用 v-w 来表示连接顶点 v 到 顶点 w 的边。图相关术语特殊的图:自环:有一条边连接一个顶点和其自身。英文称作:self-loop。平行边:有两条边连接同样的同个顶点。英文称作:parallel。多重图:含有平行边的图原创 2017-11-05 14:44:34 · 2118 阅读 · 0 评论 -
LeetCode解题-#20-Valid Parentheses
题目描述: 给一个只包含”(“, “),”, “[“, “]”, “{“, “}” 的字符串,判断这个字符串是否有效(配对)。 比如: “()[]{}” 是有效的。 “([)]” 是无效的。思路: 让 3 种括号能有效的原则要依次配对,左开口的 3 种扩号是 :”(“, “[“, “{“, 右开口的 3 种扩号是 “)”, “]”, “}”, 要让左右都配对,那就必须保证右开口扩号原创 2017-11-19 13:23:44 · 250 阅读 · 0 评论 -
LeetCode--LRU Cache
LRU == Least Recently Used. LRU 的内部继承于 LinkedHashMap。LRUCache 将元素按照访问的先后顺序保存在一条双向链接中,并保存指向开头和结尾的指针。将元素作为key,元素在链接中的位置作为value 保存起来。LRU 的两种操作:Get:将它从链表中删除,并插入链表的头部。Delete:将它从尾部删除。Android 中的 LRUCache原创 2017-11-05 00:32:05 · 249 阅读 · 0 评论 -
LeetCode基础-查找-HashTable
假设待查找的对象是这样存在的:[key1, value1], [key2, value2], [keyX, valueX], … 我们可以把key的列表转过转化存入HashTable中。 使用基于HashTable的查找需要两步:用 Hash 函数将所有 key 都转化为数组的索引(整数)。如果多个 key 转化成为同一个数组的索引,则需要解决碰撞(collision-resolution)。原创 2017-11-04 22:06:59 · 585 阅读 · 0 评论 -
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 阅读 · 0 评论 -
LeetCode解题-#9-Palindrome Number
题目描述: 判断一个数字是否是回文,不可以用额外的空间。分析: 题目的初衷是不想答题者转换成字符串再判断是否是回文。可是即使不用字符串,也不可能完全做到不用额外的空间的,还不如直接明说了限制。 另外,负数,0 结尾的数字,是无论如何也不会成为回文的。思路: 可以先把数字逆序,再比较原数字和逆序后的数字是否相同,相同则是回文。 但是如果完全逆序则有可能导致overflow,所以只能逆序半截原创 2017-11-13 00:40:34 · 249 阅读 · 0 评论 -
LeetCode基础-查找-平衡二叉查找树(红黑树)--未完成
红黑树的性质:大小为 N 的红黑树的高度不会超过 2 * lg N大小为 N 的红黑树,根结点到做任意结点的平均距离为 lg NJDK中的TreeMap 内部使用红黑树实现。 .NET中的SortedSet 内部使用红黑树实现。原创 2017-11-02 23:35:03 · 1064 阅读 · 0 评论 -
LeetCode基础--二叉树--反转左右子树
题目描述: 反转二叉树的左右子树。实现:public class Solution { public TreeNode InvertTree(TreeNode root) { if(root == null) { return null; } TreeNode tmp = root.left;原创 2017-11-29 14:37:31 · 1253 阅读 · 0 评论 -
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 · 321 阅读 · 0 评论 -
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 · 1215 阅读 · 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:18:08 · 279 阅读 · 0 评论 -
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 · 565 阅读 · 0 评论 -
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 · 1542 阅读 · 0 评论 -
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 · 706 阅读 · 0 评论 -
LeetCode基础--二叉树-判断是否对称
题目描述: 判断一个二叉树是否左右对称,比如: 1 / \ 2 2 / \ / \ 3 4 4 3思路: 对称的条件是:左子树的左子结点等于右子树的右子结点,并且左子树的右子结点等于右子树的左子结点。递归实现:public class Solution { public bool IsSymmetric(TreeNode root) {原创 2017-11-26 20:46:59 · 1093 阅读 · 0 评论 -
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 · 1398 阅读 · 0 评论 -
LeetCode基础--动态规划
动态规划:dynamic programming,是用过去的知识解决未来的问题。动态规划常用于字符串问题,可以通过解决原始问题的子问题,然后用这个子问题的结果来解决更复杂的原始问题。 通常把子问题的结果存放在一个一维或二维数组中,然后在需要时查询。动态规划还可以用在递归问题中,以避免重复地计算同一个子问题。 比如 Fibonacci 数列问题,Fn = Fn-1+ Fn-2 而 F0 = 0,原创 2017-11-23 23:50:51 · 347 阅读 · 0 评论 -
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 阅读 · 0 评论 -
LeetCode基础-字符串-Trie
Trie 来自单词 retrieval,发音为 try(避免与tree混淆),也叫做 单词查找树,或 字典树。 Trie 是树结构,除根结点外,每个结点都只会有一个父结点。每个结点都有 R 个子结点, R 是字母表的大小,而且可能含有大量的空结点。假设有字符串:“she sells sea shells by the sea shore”,可以保存成下面这样,让根结点为空:我们将每个 字符串 关联原创 2017-11-10 00:24:36 · 386 阅读 · 0 评论 -
LeetCode基础
参考书籍:《算法》第4版,[英文版讲解地址],(http://algs4.cs.princeton.edu/home/),Java语言描述《算法导论》,英文名《Introduction to Algorithms, third edition》,伪代码描述基础数据结构:数组位运算栈队列链表堆 (优先队列 Priority Queue),Java源码链接二叉树 基础及题型 二叉搜原创 2017-10-28 11:42:14 · 954 阅读 · 0 评论 -
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 · 355 阅读 · 0 评论 -
LeetCode基础-查找-二叉查找树
二叉查找树有链表的快速插入的优点,以及符号表快速查找的优点。 二叉查找树的性质是这样的:每个结点的 key 都大于其左结点的 key,小于其右结点的 key。按值从小到大遍历二叉树即是中序遍历。二叉查找树的查找操作:如果树是空的,则返回null。 如果被查找的 key 和根结点的键相待,查找命中。 否则就递归地子树中继续查找。如果被查找的 key 小于当前结点,就选择左子树,反之选择原创 2017-11-02 23:13:49 · 337 阅读 · 0 评论 -
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 · 243 阅读 · 0 评论 -
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 阅读 · 0 评论 -
LeetCode基础-图-有向图-强连通性
在有向图中,如果两个顶点 v 和 w 是互相有向的,则称它们是强连通的。 在有向图中,如果任意两个顶点都是互相有向的,则称这幅图是强连通图。 所以有以下命题:任意顶点 v 和自身也是强连通的。如果 v 和 w 强连通的,则 w 和 v 也是强连通的。如果 v 和 w 强连通,w 和 x 强连通,则 v 和 x 也是强连通的。强连通性将所有顶点分成了一些平等的部分,每个部分都是由 相互为原创 2017-11-08 22:48:05 · 1269 阅读 · 0 评论 -
LeetCode基础-图-有向图-拓扑排序
**拓扑排序**拓扑排序:给一幅有向图,把所有的顶点排序,使所有的有向边都从 排在前面的顶点 指向排在后面的顶点。(或者证明不能做到,比如有环) 拓扑排序可以用来解决优先级调度的问题。(前后顶点有依赖关系) 比如下面的课程学习顺序:比如 任务x 必须在 任务y 之前完成, 任务y 必须在 任务z 之前完成,但 任务z 必须在 任务x 之前完成,这肯定是图中有环,这样就无法完成拓扑排序了。所有首先原创 2017-11-08 22:22:33 · 936 阅读 · 0 评论 -
LeetCode基础-图-有向图
在有向图中,边是单向的。**术语**:出度:在有向图中,一个顶点的出度为该顶点指出的边的总数。 入度:在有向图中,一个顶点的出度为指向该顶点的边的总数。 表示:用 v->w 来表示 一条由 v 指向 w 的边。v 与 w 也可能是双向的。类的代码:public class Digraph{ private final int V; private int E; priv原创 2017-11-08 09:15:11 · 927 阅读 · 0 评论 -
LeetCode基础-Stack
Stack在C#和Java中都有现成的定义,且在LeetCode中也可以直接使用。 其泛型版本定义的主要属性和方法如下:public class Stack<T>{ public int Count; public void Clear(); public T Peek(); //返回的对象顶部的 Stack 而不删除它。 public T Pop(); //删原创 2017-10-30 00:19:40 · 379 阅读 · 0 评论 -
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 阅读 · 0 评论 -
LeetCode基础-图-BFS
BFS:Breadth First Search,广度优先搜索。 当有这样一个问题:计算图中两点之间的最短距离时,需要广度优先搜索,BFS 也是很多图算法的基石。要找到顶点 s 到 顶点 v 的最短路径,从 s 开始,在所有距离 s 一条边的顶点中寻找 v,如果找不到,就继续在与 s 距离一条边的顶点中寻找 v,如此下去,走到找到 v。深度优先搜索就好像是一个人在走迷宫,而广度优先搜索就像是一组人原创 2017-11-06 23:42:32 · 472 阅读 · 0 评论 -
LeetCode基础-图-DFS
DFS:Depth First Search,深度优先搜索。走迷宫的过程:选择一条没有标记过的通道,在走过的路上铺一条绳子。标记所有你第一次路过的路口和通道。当到达一个标记过的路口时(用绳子)回退到上个路口。当回退到的路口已经没有可走的通道时继续回退。 绳子可以保证你总能找到一条出路,标记则能保证你不会两次经过同一条通道或同一个路口。深度优先遍历的具体实现思路是:用一个递归方法遍历所有顶原创 2017-11-05 22:59:09 · 576 阅读 · 0 评论 -
LeetCode基础-链表
单链表数据结构: //Definition for singly-linked list. public class ListNode { public int val; public ListNode next; public ListNode(int x) { val = x; } }题型:从链表中删除一个结点从链表中插入一个结点反转链表修改链表顺序原创 2017-10-28 12:02:23 · 648 阅读 · 0 评论 -
LeetCode基础-链表-找到两个链表的交点
单链表数据结构: //Definition for singly-linked list. public class ListNode { public int val; public ListNode next; public ListNode(int x) { val = x; } }思路: 注:此算法来自discuss区排第一名的一个比较巧妙的算法。原创 2017-10-28 21:19:53 · 703 阅读 · 0 评论 -
LeetCode基础-链表-判断链表是否有环
单链表数据结构: //Definition for singly-linked list. public class ListNode { public int val; public ListNode next; public ListNode(int x) { val = x; } }思路: 有两个指针快慢套跑遍历,快指针每次走两格,慢指针每次走一格,当快原创 2017-10-28 19:15:42 · 379 阅读 · 0 评论