随笔分类 -  LeetCode

摘要:判断是否是有效的二叉搜索树,即左子树的值小于根结点,右子树的值大于根结点。可以采用递归的方式来完成,递归时如何 传递有效的参数与根结点进行比较,是此题的难点。 1 bool isValidBST(TreeNode *root) 2 { 3 isValidBST(root, INT_MIN, INT_ 阅读全文
posted @ 2016-06-16 11:30 牧马人夏峥 阅读(129) 评论(0) 推荐(0)
摘要:根据先序和中序构造二叉树、根据中序和后序构造二叉树,基础题,采用递归的方式解决,两题的方法类似。需要注意的是迭代器的用法。 //先序和中序 TreeNode *buildTree(vector<int>& preorder, vector<int>& inorder) { return buildT 阅读全文
posted @ 2016-06-07 16:35 牧马人夏峥 阅读(150) 评论(0) 推荐(0)
摘要:void connect(TreeLinkNode *root) { while (root) { //每一层循环时重新初始化 TreeLinkNode *prev = nullptr; TreeLinkNode *next = nullptr; //对于每一层 for (; root; root 阅读全文
posted @ 2016-06-01 16:04 牧马人夏峥 阅读(125) 评论(0) 推荐(0)
摘要:将左子树接到右子树之前,递归解决 void flatten(TreeNode *root) { if (root == nullptr)return; flatten(root->left); flatten(root->right); //如果没有左子树,直接返回即可 if (root->left 阅读全文
posted @ 2016-06-01 15:13 牧马人夏峥 阅读(137) 评论(0) 推荐(0)
摘要:用递归的方式来做,左右两棵子树的高度差不超过1。分成两部分,一部分递归得到树的高度,一部分递归检查左右子树是否是平衡二叉树。 int getHeight(TreeNode *root) { if (root == nullptr)return 0; return max(getHeight(root 阅读全文
posted @ 2016-06-01 14:38 牧马人夏峥 阅读(157) 评论(0) 推荐(0)
摘要:用递归比较简单,这里用迭代的方式实现。注意什么时候返回true,什么时候返回false。 bool isSameTree(TreeNode *p, TreeNode *q) { stack<TreeNode *> s; s.push(p); s.push(q); while (!s.empty()) 阅读全文
posted @ 2016-06-01 14:12 牧马人夏峥 阅读(124) 评论(0) 推荐(0)
摘要:中序遍历二叉搜索树,得到的是一个有序的结果,找出其中逆序的地方就可以了。如果逆序的地方相邻,只需把逆序的相换即可;如果不相邻,则需要找到第二个逆序对的 第二个元素再做交换。 定义两个指针p和q来指定需要交换的元素,指针pre记录当前结点的前驱结点,用来判断是否逆序。 void recoverTree 阅读全文
posted @ 2016-05-30 16:29 牧马人夏峥 阅读(98) 评论(0) 推荐(0)
摘要:采用广度优先遍历,一个变量记录层数,一个变量记录方向. void traverse(TreeNode *root, vector<vector<int>> result, int level, bool left_to_right) { if (!root)return; //如果进入下一层了,则r 阅读全文
posted @ 2016-05-30 14:57 牧马人夏峥 阅读(147) 评论(0) 推荐(0)
摘要:层序遍历,使用队列将每层压入,定义两个队列来区分不同的层。 vector<vector<int>> levelorderTraversal(TreeNode *root) { vector<vector<int>> result; vector<int>tmp; //通过两个queue来区分不同的层 阅读全文
posted @ 2016-05-28 16:27 牧马人夏峥 阅读(115) 评论(0) 推荐(0)
摘要:后序遍历,比先序和中序都要复杂。访问一个结点前,需要先判断其右孩子是否被访问过。如果是,则可以访问该结点;否则,需要先处理右子树。 vector<int> postorderTraversal(TreeNode *root) { vector<int> result; stack<TreeNode 阅读全文
posted @ 2016-05-28 16:10 牧马人夏峥 阅读(153) 评论(0) 推荐(0)
摘要:树的中序遍历。先不断压入左结点至末尾,再访问,再压入右结点。注意和先序遍历的比较 vector<int> inorderTraversal(TreeNode *root) { vector<int> result; stack<TreeNode *>s; TreeNode *p = root; wh 阅读全文
posted @ 2016-05-28 15:29 牧马人夏峥 阅读(101) 评论(0) 推荐(0)
摘要:很简单的一道题,定义一个栈保留操作数,遇操作符则弹出运算即可。 bool isOperator(string &op) { //注意用法 return op.size() == 1 && string("+-*/").find(op) != string::npos; } int evalRPN(v 阅读全文
posted @ 2016-05-28 14:44 牧马人夏峥 阅读(130) 评论(0) 推荐(0)
摘要:又是一道构思巧妙的题,暴力求解复杂度太高,通过构造一个递增栈来解决:如果当前元素小于栈顶元素,则说明栈内已经构成一个 递增栈,则分别计算以每个元素为最低值的面积;反之,则入栈。 int largestRect(vector<int> &height) { stack<int> s;//定义一个单调递 阅读全文
posted @ 2016-05-28 14:22 牧马人夏峥 阅读(178) 评论(0) 推荐(0)
摘要:扫描每个WORD的长度并记录即可。 int lengthOfLast(const char *s) { //扫描统计每个word的长度 int len = 0; while (*s) { if (*s++ != ' ')//注意不管是否满足s都要++ len++; else if (*s && *s 阅读全文
posted @ 2016-05-26 09:24 牧马人夏峥 阅读(127) 评论(0) 推荐(0)
摘要:主要看//之间的内容:如果是仍是/,或者是.,则忽略;如果是..,则弹出;否则压入堆栈。最后根据堆栈的内容进行输出。 string simplifyPath(string const& path) { vector<string> dirs; for (auto i = path.begin(); 阅读全文
posted @ 2016-05-26 09:09 牧马人夏峥 阅读(166) 评论(0) 推荐(0)
摘要:回文构词法,将字母顺序打乱。可将字母重新排序,若它们相等,则属于同一组anagrams。 可通过hashmap来做,将排序后的字母作为key。注意后面取hashmap值时的做法。 vector<string> anagrams(vector<string> &strs) { unordered_ma 阅读全文
posted @ 2016-05-26 08:28 牧马人夏峥 阅读(118) 评论(0) 推荐(0)
摘要:很有意思的一道题,不好想啊。 string getNext(string &s) { char start = s[0]; int count = 0; stringstream ss; for (int i = 0; i < s.size(); i++) { if (start == s[i]) 阅读全文
posted @ 2016-05-25 18:26 牧马人夏峥 阅读(120) 评论(0) 推荐(0)
摘要:这题实现起来还是挺麻烦的,就偷懒使用下库函数strtod()。第二个参数表示字符中不是数字的地方,如果后面是空格,则认为其仍是数字,否则不是。 bool isNumber(char *s) { char *endptr; strtod(s, &endptr); if (endptr == s)ret 阅读全文
posted @ 2016-05-25 17:20 牧马人夏峥 阅读(140) 评论(0) 推荐(0)
摘要:在一组字符串中找到最长的子串。采用纵向匹配,遇到第一个不匹配的停止。 string longestComPrefix(vector<string> &strs) { if (strs.empty())return " "; //纵向比较 for (int idx = 0; idx < strs[0] 阅读全文
posted @ 2016-05-25 17:02 牧马人夏峥 阅读(107) 评论(0) 推荐(0)
摘要:跟上题类似,主要考虑‘*’的匹配问题。如果遇到‘*’,则跳过继续匹配,如果不匹配,则s++,重新扫描。 bool isMatch2(const char *s, const char *p) { if (*p == '*') { while (*p == '*')p++; if (*p == '\0 阅读全文
posted @ 2016-05-25 16:45 牧马人夏峥 阅读(124) 评论(0) 推荐(0)