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

浙公网安备 33010602011771号