随笔分类 - 剑指Offer(第2版)
摘要:思路 这里使用层序遍历产生的序列当成序列化,再使用此序列层序创建二叉树即对应反序列化。 使用“#”代表空节点,并且各节点的值在序列化的字符串中以空格分隔。 注:本题解法不唯一,如使用:先序遍历进行序列化 + 先序创建反序列化 也是可以的。 1 /** 2 * Definition for a bin
阅读全文
摘要:思路 方法一: 保存中序遍历的结果,然后依次处理,这里使用vector保存中序遍历结果 1 /* 2 // Definition for a Node. 3 class Node { 4 public: 5 int val; 6 Node* left; 7 Node* right; 8 9 Node
阅读全文
摘要:思路 方法一:哈希表 1 /* 2 // Definition for a Node. 3 class Node { 4 public: 5 int val; 6 Node* next; 7 Node* random; 8 9 Node(int _val) { 10 val = _val; 11 n
阅读全文
摘要:思路 方法一:递归 1.最后一个节点为根节点2.左边的节点全部要小于根,右边的节点全部要大于根,因此数组可以分成两个区间,前半部分全部小于根,后半部分全部大于根3.找到两个区间的分割点,判断是否两个区间是否符合该性质 1 class Solution { 2 public: 3 bool verif
阅读全文
摘要:思路 方法一:辅助队列保存对应层数 我们可以用广度优先搜索解决这个问题。 我们可以想到最朴素的方法是用一个二元组 (node, level) 来表示状态,它表示某个节点和它所在的层数,每个新进队列的节点的 level 值都是父亲节点的 level 值加一。 最后根据每个点的 level 对点进行分类
阅读全文
摘要:思路 思路来源:https://leetcode-cn.com/problems/validate-stack-sequences/ 1 class Solution { 2 public: 3 bool validateStackSequences(vector<int>& pushed, vec
阅读全文
摘要:思路 方法一:辅助栈 (单调栈) 这里参考:面试题30. 包含 min 函数的栈(辅助栈,清晰图解) 相似题目:剑指 Offer 59 - I. 滑动窗口的最大值 1 class MinStack { 2 private: 3 stack<int> A; 4 stack<int> B; 5 publ
阅读全文
摘要:思路 模拟。思路来自:https://leetcode-cn.com/problems/shun-shi-zhen-da-yin-ju-zhen-lcof/solution/mian-shi-ti-29-shun-shi-zhen-da-yin-ju-zhen-she-di/ 代码实现 1 clas
阅读全文
摘要:思路 一开始想用左根右遍历的序列和右根左遍历的序列进行比较,如果相等则镜像对称。后来发现这种方式不对,比如样例[1, 2, 2, null, 2]就不是镜像对称的,但这种方法会返回true。 方法一:递归 1 /** 2 * Definition for a binary tree node. 3
阅读全文
摘要:思路 方法:先序遍历,递归 1 class Solution { 2 public: 3 TreeNode* mirrorTree(TreeNode* root) { 4 if(root == NULL) { 5 return NULL; 6 } 7 8 TreeNode* tmp = mirror
阅读全文
摘要:思路 方法一:如果B的先序序列是A的先序序列的子序列,并且B的中序序列也是A的中序序列的子序列,则B是A的子结构。这种方法比较暴力。 方法二:对A的每一个结点和B进行比较(这里可以使用先序遍历): 如果A->val == B->val,则A的左子树和右子树也要和B对应的左子树右子树相同。 如果A->
阅读全文
摘要:思路 解法一:双指针法 1 /** 2 * Definition for singly-linked list. 3 * struct ListNode { 4 * int val; 5 * ListNode *next; 6 * ListNode(int x) : val(x), next(NUL
阅读全文
摘要:思路 方法一:常规解法 只检查每个字符后面的字符,需要判断的地方有: 1. 消去字符串的前置空格和后置空格,比如“1 ”是合法的 2. 正负号: (1) 只能出现在第1个字符,或者出现在e或E的后1个字符; (2) 正负号的后面一个字符必须是数字, 或者小数点 (3) 最多只有2个正负号 3. 指数
阅读全文
摘要:思路 (1) 不考虑n很大的情况 1 class Solution { 2 public: 3 vector<int> printNumbers(int n) { 4 vector<int> res; 5 int m = 1; 6 for(int i = 0; i < n; ++i) 7 m = m
阅读全文
摘要:思路 二分求幂模板题。注意边界-2147483647的处理。 二分求幂的算法见: https://www.cnblogs.com/FengZeng666/p/11484835.html 代码实现 1 class Solution { 2 public: 3 double myPow(double x
阅读全文
摘要:思路 方法一:动态规划 从题目中可以看出,有最优子结构,可以联想到动态规划,其递归树如下: 可以看出,具有很多重叠子问题。 1 /*记忆化搜索代码*/ 2 class Solution { 3 private: 4 // 记忆化搜索,自顶向下 5 // memo[n]表示分割n获得的乘积最大值 6
阅读全文
摘要:思路 将行坐标和列坐标数位之和大于 k 的格子看作障碍物,那么这道题就是一道很传统的搜索题目,这里使用dfs进行搜索。 这道题还有一个隐藏的优化:我们在搜索的过程中搜索方向可以缩减为向右和向下,而不必再向上和向左进行搜索。 根据题意可推知,任意一个格子都可以由其上方格子向下走过来,或者由其左方的格子
阅读全文
摘要:思路 dfs +剪枝 代码实现 1 class Solution { 2 private: 3 int d[4][2] = {{0,1},{0,-1},{1,0},{-1,0}}; 4 int m, n; //n行m列 5 bool vis[210][210] = {false}; 6 7 publ
阅读全文
摘要:思路 (1) 暴力法:从数组的第一个元素开始顺序查找,直到找到numbers[i] > numbers[i+1]的情况,此时numbers[i+1]就是最小的元素。 (2) 二分法:讲解如下: 代码实现 1 class Solution { 2 public: 3 int minArray(vect
阅读全文
摘要:思路 代码实现 1 class CQueue { 2 private: 3 stack<int> s1; //用于插入 4 stack<int> s2; //用于删除 5 public: 6 CQueue() { 7 8 } 9 10 void appendTail(int value) { 11
阅读全文