08 2013 档案
摘要:很简单,稍微观察一下就可以得出规律:每次买入之后在最高的时候卖出,只需用low和high来记录买入、卖出的价格,遇到更高价格的时候更新high,否则卖出,然后同时更新low和high。结束之后最后一次的收入=high - low不要忘了加进去! 1 class Solution { 2 public: 3 int maxProfit(vector &prices) { 4 // Start typing your C/C++ solution below 5 // DO NOT write int main() function 6 if...
阅读全文
摘要:可以转化成图的题目,bfs,代码可以写得很短! 1 class Solution { 2 public: 3 int ladderLength(string start, string end, unordered_set &dict) { 4 // Start typing your C/C++ solution below 5 // DO NOT write int main() function 6 deque > nodes; 7 nodes.push_back(pair(start, 1)); 8 ...
阅读全文
摘要:同水题,哎,今天无心做难题,只好刷刷水题。还心不在焉地把i、j打错了,错了好几次,哭,完全没有达到做题的状态! 1 class Solution { 2 public: 3 string addBinary(string a, string b) { 4 // Start typing your C/C++ solution below 5 // DO NOT write int main() function 6 int n1 = a.size(); 7 int n2 = b.size(); 8 if (...
阅读全文
摘要:找自信刷数目的水题。题目没看清,看出只是字母了,贡献了一次WA!必须认真看清题目呀~~~ 1 class Solution { 2 public: 3 bool isPalindrome(string s) { 4 // Start typing your C/C++ solution below 5 // DO NOT write int main() function 6 if (s.size() == 0) 7 return true; 8 int i = 0; 9 int j =...
阅读全文
摘要:没有难度的题目,纯用来练习链表操作和递归的使用的,难得的一次就能ac大小数据呀! 1 class Solution { 2 public: 3 ListNode *addTwoNumbers(ListNode *l1, ListNode *l2) { 4 // Start typing your C/C++ solution below 5 // DO NOT write int main() function 6 ListNode *res = add(l1, l2, false); 7 return res; 8 ...
阅读全文
摘要:哎,又是做失败的一题,果然遇到这种需要清晰的头脑把问题用最简单的方法描述解答出来的题目就会很悲剧,写代码之前没有把问题用很简化的解法想清楚,写出来的bug不断,需要把最大路径和与节点的最大路径和分开来考虑!另外也印证了一条定理:那就是面试的题目如果代码写得超过50行,就要停下来仔细思考一下了,因为很可能是由于误入歧途了,再在原有的思路上继续非常可能是白白浪费时间!哎,泪奔~ 1 class Solution { 2 public: 3 int res; 4 int getMax(TreeNode *node) { 5 if (node == NULL) { 6 ...
阅读全文
摘要:哎,这题又不会做,想了好久,还是想不出来,最长连续的数的长度,首先想到的肯定是排序,O(nlogn),不过题目要求是O(n),于是又想到用hash的思想,类似数组记数的方式,不过即便不考虑存的空间的话,因为给定的数的大小并不在一定的范围之内,所以最后的时间复杂度会是O(max - min),max是最大的数,min是最小的数,还是不满足题目的要求。其实思考一下题目,所谓连续的数,只需要记录一段连续的数的最小的数和最大的数即可,当时也想到了这个,不过下意识的想法是用数组来存每个数所在的连续段,这样每个数还是都要往回查找是否可以扩展前面某个连续段,感觉复杂度是O(n2)了,所以放弃了这个想法。做不
阅读全文
摘要:基本可以算是树的层级遍历,很简单,一次就过了小数据和大数据;因为返回的是int,所以也不用考虑溢出的问题,直接逐层更新节点的数值,遇到叶子节点则加入到sum中,遍历结束之后返回sum即可。 1 /** 2 * Definition for binary tree 3 * struct TreeNode { 4 * int val; 5 * TreeNode *left; 6 * TreeNode *right; 7 * TreeNode(int x) : val(x), left(NULL), right(NULL) {} 8 * }; 9 */...
阅读全文
摘要:哎,做得比较郁闷的一道题,如果面试做这一题的话,肯定就跪了,一开始的时候思路就错了,只想着怎样把“O"变成"X",解的过程是遇到了"O"了再去判断,以dfs的方式遍历它四周的点,判断是否被"X"包围,如果被包围的话则改成"O"。只能过小数据,大数据会在一个超长的输入那里出现Runtime Error。后来到网上看了一下,发现正确的思路应该是用dfs或者bfs从外面一圈判断是否可连接到外面的”O",因为如果最外面一圈如果都是"X"的话,那么肯定是被包围的,所有的”O“都要被改成
阅读全文
摘要:题目看起来很简单,很容易想到直接排序后二分查找,时间复杂度是O(nlogn),不过要找出的是两个数在原数组中的索引,而不是这两个数本身,所以必须记录每个数原来的位置,可能有人会想到用map,由于可能有相同数值的两个数,所以map是不行的。那就用包含数和位置的struct吧,其实不用那么麻烦,直接用一个包含pair的数组就可以了,不过注意sort的比较函数要定义到class的外部,否则调用的时候找不到函数,或者定义为类的static成员函数也是可以的。 1 bool compare(pair a, pair b) { 2 return a.first twoSum(vector &nu.
阅读全文
摘要:题目是给定一个三角形,求最小的路径和,每一步只能移动到它的相邻列,这条规则要看清楚,意思是第i行的第j列只能移动到第 i + 1 行的第j列或j + 1列。这题也比较简单,依然是DP的思路,保存每一行每一列的从顶端到该元素的最小和即可。题目下面的这个提示不是很理解:Note:Bonus point if you are able to do this using onlyO(n) extra space, wherenis the total number of rows in the triangle.按照我上面的方法根本就不需要额外的空间,直接在给的三角形上从上到下逐步更新每个元素的最小和
阅读全文
摘要:还是回文数,不过这题是要找出所有可能的划分方法,没有太大的难度,主要是要对细节思考细心一点。我的解法:依然是DP的思想,保存每一个位置的所有划分方法,每一个合法的划分是一个字符串数组vector subvec, 每个位置的划分方法则是所有不同合法划分组成的数组vector> res,则保存所有位置的可划分的解的是各个位置的划分方法组成的数组vector>> parvec;DP的公式推导:首先在已知s[0..j]的所有划分情况时,j + 1的划分方法等于所有可以j + 1构成回文的位置k(k >= 0 and k > partition(string s) { 4
阅读全文
摘要:LeetCode OJ上的第一题,很简单的DP,之前轻松就过了小数据,大数据的时候超时了,后来在网上看到说还需要优化一下Palindrome的判断过程,于是用一个二维数据保存字符串中任意两个位置i,j是否是回文的状态。不过遇到两个问题折腾了两个小时:1.函数调用的时候字符串参数必须用引用,值传递的话会memory out limit;2.声明在函数外部的vector> palindrome,在插入元素之前要先调用clear清空;不然会出现莫名其妙的WA或者Runtime Error;代码如下: 1 class Solution { 2 public: 3 vector> palin
阅读全文