随笔分类 -  LeetCode

摘要:问题给出一个元素以递增序列排序的单链表,将其转换为一棵高度平衡的二叉搜索树。初始思路二叉搜索树高度平衡,意味着左右子树的高度要平衡。根据二叉树左子树节点小于根节点,右子树节点大于根节点的性质:我们在待选节点中选择值为中位数的节点作为根节点,所有小于中位数的节点作为左子树,所有大于中位数的节点作为右子树,即可满足高度平衡的要求。由于题目给出的已经是排好序的单链表,我们只要每次选择中间的节点即可。然后通过递归处理左右子树,最终完成高度平衡二叉搜索树的构建。最终完成代码如下: 1 class Solution { 2 enum ChildType 3 { 4 ... 阅读全文
posted @ 2013-08-23 00:19 Shawnone 阅读(535) 评论(0) 推荐(0) 编辑
摘要:问题给出一棵二叉树,判断它是否在高度上是平衡的。对于本问题,高度上平衡的二叉树定义为:每个节点的两棵子树的深度差永远不大于1的一棵二叉树。初始思路根据定义,思路应该比较直接:递归计算每个节点左右子树的深度,只要发现一次深度差大于1的情况,即可终止递归返回不平衡的结果。最终代码如下: 1 class Solution 2 { 3 public: 4 bool isBalanced(TreeNode *root) 5 { 6 if(!root) 7 { 8 return ... 阅读全文
posted @ 2013-08-01 00:05 Shawnone 阅读(343) 评论(0) 推荐(0) 编辑
摘要:问题给出一棵二叉树,找出它的最小深度。最小深度是指从根节点沿着最短路径下降到最近的叶子节点所经过的节点数。初始思路不难看出又是一个需要层次遍历二叉树的题目,只要在112基础上作出简单修改即可得出答案。 1 class Solution 2 { 3 public: 4 int minDepth(TreeNode *root) 5 { 6 if(!root) 7 { 8 return 0; 9 }10 11 ... 阅读全文
posted @ 2013-07-25 23:06 Shawnone 阅读(493) 评论(0) 推荐(0) 编辑
摘要:问题给出一棵二叉树及一个和值,检查该树是否存在一条根到叶子的路径,该路径经过的所有节点值的和等于给出的和值。例如,给出以下二叉树及和值22: 5 / \ 4 8 / / \ 11 13 4 / \ \ 7 2 1函数返回true,因为存在一条根到叶子的路径5->4->11->2,其路径和为22。初始思路鉴于题目要求找到一条路径和符合要求即可,选择层次遍历二叉树是一种比较合适的选择-保证了我们首先找到的是最短的路径从而节省了时间。另外由于没有禁止修改原二叉树的值,我们在处理过程中可以把每个点的值修改为到达这点时的路径和,方便比较。至于层次遍历的方法,... 阅读全文
posted @ 2013-07-25 22:51 Shawnone 阅读(286) 评论(0) 推荐(0) 编辑
摘要:问题给出一个二叉树,将其原地平面化为链表。例如,给出: 1 / \ 2 5/ \ \ 3 4 6平面化后的树看起来应该是这样: 1\ 2 \ 3 \ 4 \ 5 \ 6初始思路观察例子中平面化的过程,不难发现其实就是一个二叉树前序遍历的过程。让我们复习一下二叉树前序遍历的方法,根据wiki条目Tree traversal,伪代码如下:preorder(node) if node == null then return visit(node) preorder(node.left) preorder(node.ri... 阅读全文
posted @ 2013-07-17 23:27 Shawnone 阅读(342) 评论(0) 推荐(0) 编辑
摘要:问题给出字符串S和T,计算S中为T的不同的子序列的个数。一个字符串的子序列是一个由该原始字符串通过删除一些字母(也可以不删)但是不改变剩下字母的相对顺序产生的一个新字符串。如,ACE是ABCDE的一个子序列,但是AEC不是。这里有一个例子:S=“rabbbit”,T=“rabbit”返回值应为3初始思路要找出子序列的个数,首先要有找出S中为T的子序列的方法。T是S的子序列,首先其每一个字母肯定会在S中出现,通过遍历T的每一个字母即可完成这个检查。而根据不能乱序的要求,下一个字母在S中出现的位置不能在上一个字母在S中出现的位置之前。由此,我们得到下面的算法:循环遍历T 如果当前字母在S中,而且在 阅读全文
posted @ 2013-07-15 23:09 Shawnone 阅读(3448) 评论(1) 推荐(0) 编辑
摘要:问题给出如下结构的二叉树:struct TreeLinkNode { TreeLinkNode *left; TreeLinkNode *right; TreeLinkNode *next;}填充每一个next指针使其指向自己的右边邻居节点。如果没有右边的邻居节点,next指针须设成NULL。在开始时,所有的next指针被初始化成NULL。注意:你只能使用常数级别的额外空间你可以假设该树为完全二叉树(即所有叶子节点都在同一层,而且每个父节点都有两个子节点)。例如,给出如下完全二叉树: 1 / \ 2 3 / \ / \ 4 5 6 7在调用你的函数后,树看起来... 阅读全文
posted @ 2013-07-09 21:41 Shawnone 阅读(1750) 评论(0) 推荐(0) 编辑
摘要:问题给出变量numRows,生成杨辉三角形的前numRows行。例如,给出numRows=5,返回:[ [1], [1,1], [1,2,1], [1,3,3,1],[1,4,6,4,1]]初始思路基本算法和杨辉三角形II(Pascal's Triangle II)的基本一致。每算完一行的值将这些值拷贝一份到vector中即可。代码如下: 1 class Solution { 2 public: 3 std::vector > generate(int numRows) 4 { 5 std::vector > result; ... 阅读全文
posted @ 2013-07-02 23:55 Shawnone 阅读(287) 评论(0) 推荐(0) 编辑
摘要:问题给出一个索引k,返回杨辉三角形的第k行。例如,给出k = 3,返回[1, 3, 3, 1]注意:你可以优化你的算法使之只使用O(k)的额外空间吗?初始思路首先来复习复习杨辉三角形的性质(来自wiki):杨辉三角以正整数构成,数字左右对称,每行由1开始逐渐变大,然后变小,回到1。第行的数字个数为个。第行的第个数字为组合数。第行数字和为。除每行最左侧与最右侧的数字以外,每个数字等于它的左上方与右上方两个数字之和(也就是说,第行第个数字等于第行的第个数字与第个数字的和)。这是因为有组合恒等式:。可用此性质写出整个杨辉三角形。看到第2条和5条是不是发现和[LeetCode 120] - 三角形(T 阅读全文
posted @ 2013-06-30 19:11 Shawnone 阅读(1411) 评论(0) 推荐(1) 编辑
摘要:问题给出一个三角形,找出从顶部至底部的最小路径和。每一步你只能移动到下一行的邻接数字。例如,给出如下三角形:[ [2], [3,4], [6,5,7], [4,1,8,3]]从顶部至底部的最小路径和为11(即2+3+5+1=11)。注意:加分项-如果你能只使用O(n)的额外空间,n为三角形中的总行数。初始思路最直接的思路就是把路径都走一遍。即从顶点出发,分别往左中右移动(如果可能的话);然后对走到的位置继续进行同样移动,直到走到最后一行。这样就可以得到一个递归的方案,而递归的结束条件就是前面所说的走到最后一行。伪代码如下:[最短路径长度] 查找路径(当前节点坐标,当前路径值)如果是最后一行.. 阅读全文
posted @ 2013-06-29 15:48 Shawnone 阅读(2228) 评论(3) 推荐(0) 编辑
摘要:问题假设你有一个数组,其中的第i个元素表示一只股票在第i天的价格。如果只允许你完成一次交易(即买入并卖出股票一次),设计一个找出最大利润的算法。初始思路和122一样,基于买入与卖出股票的最佳时机III中的分析很容易得出答案。由于只允许进行一次交易,本题更加简单,我们只需按III中的方法不断更新最大利润即可。 1 class Solution { 2 public: 3 int maxProfit(std::vector<int> &prices) 4 { 5 return CaculateProfit(prices).profit... 阅读全文
posted @ 2013-06-20 22:34 Shawnone 阅读(558) 评论(0) 推荐(0) 编辑
摘要:问题假设你有一个数组,其中的第i个元素表示一只股票在第i天的价格。设计一个算法找出最大的利润值。你可以进行任意多次的交易(即多次的卖出并买入一份股票)。你不能在同一时间进行多次交易(即你必须在再次买入股票之前卖出当前的股票)初始思路有了在买入与卖出股票的最佳时机III中的分析,这题就很容易得出答案了。像III中那样,我们使用3个变量来纪录利润:Profit currentProfit;Profit maxProfit;int totalProfit;currentProfit表示当前日期卖出的利润,maxProfit表示本次交易中的最大利润,totalProfit记录总利润。由于可以进行任意多 阅读全文
posted @ 2013-06-19 22:51 Shawnone 阅读(589) 评论(0) 推荐(0) 编辑
摘要:问题假设你有一个数组,其中的第i个元素表示一只股票在第i天的价格。设计一个算法找出最大的利润值。你最多只能进行两次交易。注意:你不能在同一时间进行多次交易(即你必须在再次买入股票之前卖出当前的股票)初始思路我们先来考虑只能进行一次交易的情况,即只能买入并卖出一次。可以尝试在第一天就买入股票,然后按顺序计算后面每一天卖出股票后的利润。将该利润和一个保存最大利润的变量比较,如果更大就更新最大利润。很显然,第一天就买入并在利润最大时卖出肯定不会是所有情况的答案,因为股票的价格是会下跌的。那么在什么情况下我们考虑尝试改变买入的时间呢?和第一天买入的价格相比,后面的价格无非就分两种情况:价格更高。这种情 阅读全文
posted @ 2013-06-09 22:28 Shawnone 阅读(1298) 评论(0) 推荐(1) 编辑
摘要:问题给出一个二叉树,找到其中的最大路径和。路径可以从树中任意一个节点开始和结束。例如:给出如下二叉树, 1 / \ 2 3返回6。初始思路为了简化分析,我们先假设二叉树中所有节点的值都是正数。通过观察可以发现,一棵二叉树的最大路径,就是其左子树的最大路径加上右子树的最大路径。看起来可以从根节点出发通过深度优先递归来求解:函数 查找路径 如果是叶子节点,返回叶子节点的值 如果不是叶子节点 左子树路径和 = 查找路径(左子树) 右子树路径和 = 查找路径(右子树) 如果左子树路径+右子树路径和+当前节点值 > 当前最大路径,更新最大路径 返回左子树路径+右子树路径和+当... 阅读全文
posted @ 2013-06-08 22:02 Shawnone 阅读(4637) 评论(0) 推荐(0) 编辑
摘要:问题给出一个字符串,检查它是不是一个回文。判断过程中只考虑字母数字的字符并且忽略大小写。例如:"A man, a plan, a canal: Panama"是一个回文"race a car"不是一个回文注意:在这里我们将空字符串定义为回文初始思路判断回文可以使用经典的两头加逼的方法。即使用一个指针指向字符串首部,另一个指针指向字符串尾部。比较被指向的两个字符,如果不等,不是回文,中止比较;如果相等,两个指针各自向中间移动。如此重复直到两指针相交或有字符不等。如判断raceacar:下标0,r = 下标7,r下标1,a = 下标6,a下标2,c = 下标 阅读全文
posted @ 2013-06-07 23:32 Shawnone 阅读(916) 评论(0) 推荐(1) 编辑
摘要:问题给出两个单词(start和end)与一个字典,找出从start到end的最短转换序列的长度。规则如下:一次只能改变一个字母中间单词必须在字典里存在例如:给出start="hit"end="cog"dict=["hot","dot","dog","lot","log"]因为其中一条最短的转换序列为"hit" -> "hot" -> "dot" -> "dog" 阅读全文
posted @ 2013-06-06 22:44 Shawnone 阅读(1119) 评论(0) 推荐(0) 编辑
摘要:问题给出两个单词(start和end)与一个字典,找出从start到end的最短转换序列。规则如下:一次只能改变一个字母中间单词必须在字典里存在例如:给出start = "hit"end = "cog"dict = ["hot","dot","dog","lot","log"]返回[ ["hit","hot","dot","dog","cog"], [&qu 阅读全文
posted @ 2013-06-05 22:18 Shawnone 阅读(15169) 评论(2) 推荐(2) 编辑
摘要:问题给出一个未排序的整数数组,找出最长的连续元素序列的长度。如:给出[100, 4, 200, 1, 3, 2],最长的连续元素序列是[1, 2, 3, 4]。返回它的长度:4。你的算法必须有O(n)的时间复杂度。初始思路要找连续的元素,第一反应一般是先把数组排序。但悲剧的是题目中明确要求了O(n)的时间复杂度,要做一次排序,是不能达到的。不过我们还是先来看看排序的方案要怎么实现。简单来说,排序后我们只要遍历数组,检查当前值减1是否等于上一个值,如果等,增加当前连续序列的计数;如果不等,将当前计数与当前最大值比较,如果更优替换最大值, 并重置计数为1。具体到细节上,我们还要考虑几个问题:- 第 阅读全文
posted @ 2013-05-26 12:14 Shawnone 阅读(10795) 评论(4) 推荐(0) 编辑
摘要:问题给定一个节点取值只包含数字0-9的二叉树,每条根节点至叶子节点的路径都可以表示一个数字。例如,根至叶子路径1->2->3表示数字123。求所有根至叶子数字的和。例如, 1 / \2 3根至叶子路径1->2表示数字12根至叶子路径1->3表示数字13返回值sum=12+13=25初始思路要求和就必须把所有路径列出来,所以解决问题的核心就是要遍历所有根到叶子的路径。遍历二叉树容易想到通过递归访问左右子节点直到找到叶子,此时发现一条路径。所以递归结束的条件是当前节点为叶子节点,而一个叶子节点是没有子节点的,所以递归结束条件用代码表示为:root->left == 0 阅读全文
posted @ 2013-05-24 19:17 Shawnone 阅读(1034) 评论(0) 推荐(0) 编辑
摘要:问题给出一个包含'X'和'O'的2D板,捕获所有'X'围绕的区域。一个区域被捕获是指翻转被围绕区域中的所有'O'为'X'。例如,X X X XX O O XX X O XX O X X在运行你的函数后,板子将变为:X X X XX X X XX X X XX O X X初始思路判断一个O点是否被X围绕,其实就是看从该点出发有没有一条路径能走到二维数组的区域外。在程序语言中,向上下左右移动分别为:[i-1, j], [i+1, j], [i, j-1], [i, j+1]。而找路径的步骤就是从O点出发向附近的O点不断 阅读全文
posted @ 2013-05-22 23:32 Shawnone 阅读(2643) 评论(0) 推荐(0) 编辑