09 2013 档案
摘要:二叉树的遍历:先序,中序,后序;二叉树的遍历有三种常见的方法,最简单的实现就是递归调用,另外就是飞递归的迭代调用,最后还有O(1)空间的morris遍历;二叉树的结构定义:1 struct TreeNode {2 int val;3 TreeNode *left;4 TreeNode *right;5 TreeNode(int x) : val(x), left(NULL), right(NULL) {}6 };1.先序遍历:递归:1 void preOrderRecursive(TreeNode *root) {2 if (!root)3 ...
阅读全文
摘要:树的遍历,递归: 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 */10 class Solution {11 public:12 bool isSymmetric(TreeNode *root) {13 // St...
阅读全文
摘要:编辑距离,很常见的题目,貌似去年google笔试就考了这道题,典型的DP,dp[i][j]表示word2[i]到word1[j]的最小编辑距离;当word2[i]与word1[j]不相同时有三种方式:1.改变字符,dp[i][j] = dp[i - 1][j- 1] + 1;2.插入字符,dp[i][j] = dp[i ][j - 1] + 1;3.删除字符,dp[i][j] = dp[i - 1][j] + 1;故dp[i][j] = min(1,2,3);当word2[i]与word1[j]相同时:dp[i][j] = dp[i - 1][j - 1]; 1 class Solution
阅读全文
摘要:看清问题,用DP就可以了,之前我首先想到的是图的搜索,实际上在这里并不适用;必须遍历每个点,计算它的最大矩阵,遍历的顺序为从左上角到右下角,x, y表示左边的最大长度,y表示上面的最大长度,然后计算每个点的最大面积; 1 class Solution { 2 public: 3 int maximalRectangle(vector > &matrix) { 4 // Start typing your C/C++ solution below 5 // DO NOT write int main() function 6 int res...
阅读全文
摘要:又是这种需要仔细考虑的题目,很容易就会漏掉一些情况,哎,感冒了,完全不在状态,调了好几个小时,写代码的能力实在是不行,总感觉写出来的代码不够优雅, 1 class Solution { 2 public: 3 int trap(int A[], int n) { 4 // Start typing your C/C++ solution below 5 // DO NOT write int main() function 6 int res = 0; 7 if (A == NULL) { 8 re...
阅读全文
摘要:判断合法数字,之前好像在哪里看到过这题,记得当时还写了好久,反正各种改,今天看到了大神的解法(https://github.com/fuwutu/LeetCode/blob/master/Valid%20Number.cpp),用有限状态机,非常简洁,不需要复杂的各种判断!先枚举一下各种合法的输入情况:1.空格+ 数字 +空格2.空格+ 点 + 数字 +空格3.空格+ 符号 + 数字 + 空格4.空格 + 符号 + 点 + 数字 +空格5.空格 + (1, 2, 3, 4) + e + (1, 2, 3, 4) +空格组后合法的字符可以是:1.数字2.空格有限状态机的状态转移过程:起始为0:
阅读全文
摘要:字符串匹配,由于*可以匹配任意的一串字符,必须遍历所有可能的匹配情况,所以这里用迭代比递归要更好一点,遇到*之后,假定*匹配0个字符,一直到匹配整个s字符,遍历判断是否可以匹配成功;用指针prep记录*后面一个非*字符,用pres来记录遍历的起始点; 1 class Solution { 2 public: 3 bool isMatch(const char *s, const char *p) { 4 // Start typing your C/C++ solution below 5 // DO NOT write int main() funct...
阅读全文
摘要:经典的N皇后问题,这里学到了一个非常牛的新方法(http://www.matrix67.com/blog/archives/266),用位运算来求解N皇后问题;思路其实也很容易懂,一点都不复杂,同样是遍历每一行的每一列,只不过所有冲突的位置都用bit位置记录下来了,首先考虑在第k行的第j列放一个皇后,那么第k + 1行的第j - 1列和 j +1列都会与该皇后冲突,用位运算的左右移位就能表示所有列的有冲突的位置,那么在选择第k + 1行的放置位置的时候就只能选择无冲突的位置。 1 class Solution { 2 public: 3 int totalNQueens(int n) ...
阅读全文
摘要:斐波那契数列; 1 class Solution { 2 public: 3 int climbStairs(int n) { 4 // Start typing your C/C++ solution below 5 // DO NOT write int main() function 6 if (n fb(n + 1, 1);10 fb[2] = 2;11 for (int i = 3; i <= n; ++i) {12 fb[i] = fb[i - 1] + fb[i - ...
阅读全文
摘要:很简单的dfs; 1 class Solution { 2 public: 3 bool exist(vector > &board, string word) { 4 // Start typing your C/C++ solution below 5 // DO NOT write int main() function 6 if (word.empty()) { 7 return true; 8 } 9 if (board.empty()) {10 r...
阅读全文
摘要:中等难度的题目,可是还是想不出来,哎,这种题目应该属于必须做对的题目,没有什么特别的考虑,只是给你设置了一个障碍,需要你想办法翻越这个障碍,看了提示用两个指针,还是没做出来;主要这种做法完全没有一点印象和灵感,还是锻炼和接触的太少了;解法很简洁,只需要递进地移动开始指针就可以了,其实关键在于设计移动的策略和条件;我发现其实一般简洁的解法当中都加入了一些对人来说显而易见的重复,我之前的想法一直是在考虑移动起始点,然后再去判断是否可以满足包含的条件,这样就会很难处理,需要记录的各种条件就会比较多;最后才发现其实保存前面已经满足条件的状态不变就行了,遇到新的元素之后,只需要判断它是否可以取代前面的元
阅读全文
摘要:看起来很简单,实际上超级难的题目呀,开始怎么想都只能想到O(n^2)的方法,后来看了一下提示这道题是用栈,思考了一下写了一个,基本思路算是理解了,不过关键在于遇到一个小于栈顶的数时,在不断弹出栈中比该元素大的数的时候要记住弹出元素的个数,所以我写的是用两个值来表示栈中的一个元素,一个是高度,另一个是个数,可是这样还有一个问题:每次更新的时候只更新了左边比它大的元素的个数,当后面再有元素弹出时,这时它右边的这些弹出了的元素的长度就没有被计算,所以关键问题在于怎么记录一个元素左右比它大的元素的数目,即它的最大长度,哎,始终想不到比较高效的方式,如果直接给每个元素一个值来记录的话,这样每次都需要遍历
阅读全文
摘要:哎,难题又不会做,思路没有什么难度,关键是要把问题思考透彻,要考虑的要点还是挺多的,不容易一下子都考虑到;我开始的思路是按照树的根去递归的,这样就必须要没有重复元素,因为需要每次在s2中查找s1中的元素;怎么说呢,有点考虑的过于specific了,其实直接把字符串分成两部分递归就可以了,不过需要注意不能漏掉两部分可能次序调换的情况。 1 class Solution { 2 public: 3 bool isScramble(string s1, string s2) { 4 // Start typing your C/C++ solution below 5 ...
阅读全文
摘要:看懂题目后非常简单,找到规律就比较好写了,如果已经有最低k位的格雷码了的话,只需要把k+1位变成1,然后和前面k位的格雷码组合在一起就行了,这时候前k位格雷码的顺利要倒过来; 1 class Solution { 2 public: 3 vector grayCode(int n) { 4 // Start typing your C/C++ solution below 5 // DO NOT write int main() function 6 vector res; 7 if (n &res, int k, in...
阅读全文
摘要:哎,写代码太不专注了,还是头脑和注意力不够集中,需要多在脑子里面磨练,另外写程序的思维方式还比较土,总喜欢单独考虑很多特殊情况,导致代码看起来很繁琐,需要多看别人的代码好好学习如何写得简洁短小; 1 class Solution { 2 public: 3 vector restoreIpAddresses(string s) { 4 // Start typing your C/C++ solution below 5 // DO NOT write int main() function 6 vector res; 7 ...
阅读全文
摘要:同上一道返回bst树的题目的思路,求数目的话更加简单; 1 class Solution { 2 public: 3 int numTrees(int n) { 4 // Start typing your C/C++ solution below 5 // DO NOT write int main() function 6 if (n <= 0) { 7 return 0; 8 } 9 int count = 0;10 getNum(count, 1, n + 1...
阅读全文
摘要:生成二叉查找树;哎,思考了大半天才写出来,主要卡在生成结点上了,开始没考虑好怎么把不同的树在不同的地方复制前面的部分,还是对递归的使用不够成熟,理解和掌握的还不够好! 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 */10 class So...
阅读全文
摘要:很显然的DP,基本算是一次过了,比较简单! 1 class Solution { 2 public: 3 bool isInterleave(string s1, string s2, string s3) { 4 // Start typing your C/C++ solution below 5 // DO NOT write int main() function 6 int n1 = s1.size(); 7 int n2 = s2.size(); 8 int n3 = s3.size()...
阅读全文
摘要:很简单,可惜刚开始把题目都理解错了;实际是找出所有的anagrams,把每个字符串sort一下即可,然后用map去找是否存在和它一样的anagrams,找到之后把当前的加入到返回数组中,并把map中已存在那个字符串也加入到数组中,只加入一次。class Solution {public: vector anagrams(vector &strs) { // Start typing your C/C++ solution below // DO NOT write int main() function vector res; if...
阅读全文
摘要:哎,这两天都是在做水题,做水题都还一点状态都木有,经常一道题调好久~~~哎,好拙计! 1 /** 2 * Definition for singly-linked list. 3 * struct ListNode { 4 * int val; 5 * ListNode *next; 6 * ListNode(int x) : val(x), next(NULL) {} 7 * }; 8 */ 9 class Solution {10 public:11 ListNode *mergeKLists(vector &lists) {12 ...
阅读全文
摘要:繁琐的链表操作,很开心,一次就过了,不过推敲的时间也有20分钟了,还是加快思考的速度。 1 /** 2 * Definition for singly-linked list. 3 * struct ListNode { 4 * int val; 5 * ListNode *next; 6 * ListNode(int x) : val(x), next(NULL) {} 7 * }; 8 */ 9 class Solution {10 public:11 ListNode *reverseKGroup(ListNode *head, int k)...
阅读全文
摘要:没想出来,想到了count sort,但是没想到怎样用常量空间的方法。看了大神Annie Kim(https://github.com/AnnieKim/LeetCode)的代码,才豁然开朗,也算有学习和总结到了一条规律:凡是要求常量空间的题目要尽量利用题目中已有的空间!这道题目很经典,非常好的面试题。就算知道了方法以后,实现的时候也还是有一定的技巧的,每个位置i都需要多次交换,直到A[i] = i + 1为止,不过对于A[i] > n的元素可以先不管,最后再交换到最后! 1 class Solution { 2 public: 3 int firstMissingPositive(i.
阅读全文
摘要:平衡二叉树的判断,DFS,一直没想到怎么同时返回结点的长度和状态,把高度放到参数里面比较简便! 1 class Solution { 2 public: 3 bool isBalanced(TreeNode *root) { 4 // Start typing your C/C++ solution below 5 // DO NOT write int main() function 6 int height = 0; 7 return getHeight(root, height); 8 9 ...
阅读全文
摘要:数据结构的基础知识,根据中序、后序遍历或者先序、中序遍历构建二叉树;典型的递归;中序、后序的代码: 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 */10 class Solution {11 public:12 TreeNode ...
阅读全文
摘要:有点类似于层级遍历,用两个数组保存上下两层的结点即可!同样的代码两道题目都可以过! 1 /** 2 * Definition for binary tree with next pointer. 3 * struct TreeLinkNode { 4 * int val; 5 * TreeLinkNode *left, *right, *next; 6 * TreeLinkNode(int x) : val(x), left(NULL), right(NULL), next(NULL) {} 7 * }; 8 */ 9 class Solution {10 public:1...
阅读全文
摘要:典型的dp,最开始写了个递归的,过不了大数据, 1 class Solution { 2 public: 3 int numDistinct(string S, string T) { 4 // Start typing your C/C++ solution below 5 // DO NOT write int main() function 6 int m = S.length(); 7 int n = T.length(); 8 return getDistinct(S, T, m - 1, n -...
阅读全文

浙公网安备 33010602011771号