摘要: 问题假设你有一个数组,其中的第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 阅读(561) 评论(0) 推荐(0) 编辑
摘要: 问题假设你有一个数组,其中的第i个元素表示一只股票在第i天的价格。设计一个算法找出最大的利润值。你可以进行任意多次的交易(即多次的卖出并买入一份股票)。你不能在同一时间进行多次交易(即你必须在再次买入股票之前卖出当前的股票)初始思路有了在买入与卖出股票的最佳时机III中的分析,这题就很容易得出答案了。像III中那样,我们使用3个变量来纪录利润:Profit currentProfit;Profit maxProfit;int totalProfit;currentProfit表示当前日期卖出的利润,maxProfit表示本次交易中的最大利润,totalProfit记录总利润。由于可以进行任意多 阅读全文
posted @ 2013-06-19 22:51 Shawnone 阅读(592) 评论(0) 推荐(0) 编辑
摘要: 问题假设你有一个数组,其中的第i个元素表示一只股票在第i天的价格。设计一个算法找出最大的利润值。你最多只能进行两次交易。注意:你不能在同一时间进行多次交易(即你必须在再次买入股票之前卖出当前的股票)初始思路我们先来考虑只能进行一次交易的情况,即只能买入并卖出一次。可以尝试在第一天就买入股票,然后按顺序计算后面每一天卖出股票后的利润。将该利润和一个保存最大利润的变量比较,如果更大就更新最大利润。很显然,第一天就买入并在利润最大时卖出肯定不会是所有情况的答案,因为股票的价格是会下跌的。那么在什么情况下我们考虑尝试改变买入的时间呢?和第一天买入的价格相比,后面的价格无非就分两种情况:价格更高。这种情 阅读全文
posted @ 2013-06-09 22:28 Shawnone 阅读(1303) 评论(0) 推荐(1) 编辑
摘要: 问题给出一个二叉树,找到其中的最大路径和。路径可以从树中任意一个节点开始和结束。例如:给出如下二叉树, 1 / \ 2 3返回6。初始思路为了简化分析,我们先假设二叉树中所有节点的值都是正数。通过观察可以发现,一棵二叉树的最大路径,就是其左子树的最大路径加上右子树的最大路径。看起来可以从根节点出发通过深度优先递归来求解:函数 查找路径 如果是叶子节点,返回叶子节点的值 如果不是叶子节点 左子树路径和 = 查找路径(左子树) 右子树路径和 = 查找路径(右子树) 如果左子树路径+右子树路径和+当前节点值 > 当前最大路径,更新最大路径 返回左子树路径+右子树路径和+当... 阅读全文
posted @ 2013-06-08 22:02 Shawnone 阅读(4640) 评论(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 阅读(918) 评论(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 阅读(1124) 评论(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 阅读(15193) 评论(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 阅读(10821) 评论(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 阅读(1038) 评论(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 阅读(2648) 评论(0) 推荐(0) 编辑