Leetcode236
Q:只判断左边=p q 直接返回 右边为何不判断?
https://www.cnblogs.com/grandyang/p/4641968.html
class Solution { public: TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) { if (!root || p == root || q == root) return root; TreeNode *left = lowestCommonAncestor(root->left, p, q); if (left && left != p && left != q) return left; TreeNode *right = lowestCommonAncestor(root->right, p , q); if (left && right) return root; return left ? left : right; } };
Leetcode206
Q:链表反转逻辑?
Leetcode53:
https://www.cnblogs.com/grandyang/p/4377150.html
二分搜索的解法:感觉会导致一直有中间值
Leetcode:
每日一题用位运算方法怎么做
LeetCode146:
map为何是int和iterator list<pair<int,int>>
Leetcode summary:
91
A:注意 为0 的情况,正常数字1-9之间肯定有对应的英文字母,但是0是例外。两方面:1、不能在开头前导0 2、中间为0 就不能加dp[i-1]
substr(起始下标,持续长度)
如果有减去的情况,小心减完是否在正常范围内
94
A:递归很好写,主要是迭代怎么和栈结合起来,因为树涉及到嵌套,所以可以和stack queue这种结合起来。BFS用queue存储因为按成遍历,先进的节点的子节点也可以先被遍历,是符合bfs的遍历顺序的,但中序遍历,需要先把所有左节点处理好才能处理中间及右边,所以还需要循环配合使用,while先把所有左节点放入,此时在栈顶的就是最下面的左节点,所以可以先把他的值存入结果,然后再看其右边是否有值。
15:3sum
A:本题没有神来之笔的大幅度优化,所以顶多从n^3优化到nlogn+n^2,3个数求和,利用排序本身先固定住一个数,3个数中,若想和为0,最小的数一定是≤0的,所以固定最左边的数,比固定中间位置更好。当值大于0时就可以跳出循环剪枝,一直遍历到倒数第三个数就OK,
需要注意对重复值的去除有两处,本身遍历时有重复元素不要重复计算,在寻找答案时,重复元素也会造成结果重复。所以需要用while清除部分阻碍
这种题一般都需要排序带来有序的天然优势。注意固定最左边的值是题眼。
begin end返回的是迭代器
front back返回具体数值
121:
A:方向是关键,从前往后,一边遍历就可以一边收集最小值,然后用当前值减去最小值和最大盈利比,否则最大值每次不好统计,随着数字向后移动还会变化,但是最小值却可以在数组中一直维护
543:
A:返回值和最后的结果可以不是一个,用辅助函数的返回值return,递归调用结果,用&的ans变量来存储最大值。最大直径需要保存在某个节点的左右最大值,但是传递上去只能选择左右最大的值和当前节点相加传递,不能左右都加入计算。
62:
A:求路径 第一反应是用dfs做,但不是求具体路径【dfs】,而是总数【dp】
dp分为一维 二维,这里的dp[i][j]可以进行转化,用一个一维dp数组就能表示整体和,因为初始化需要第一列为1,每次操作都是从i=1的时候开始加,所以第一列的值永远不会变都是1,都是符合dp操作的,故不需要额外变量,可以不要中间存储,直接赋值给数组,因为数组当前值存储新值后,就不会用来参与计算,所以不会产生覆盖问题。可以直接用dp[j]+=dp[j-1] 最后取dp[n-1]
或者用组合的思想,组合的思路是总共m-1,n-1条路,从中选择m-1条,用组合的公式即可求解
1:
对步骤的简化是什么有用的,比如在two sum中求和,用hashmap存储,普通做法是先存储,再遍历,看用target减值,是否在hash表中
改进:先判断target-当前value值是否存在,存在就可以直接结束,不存在再考虑
79:
常规走迷宫题,唯二需要注意是,建立visited数组,标记已经走过的,或者直接对数组进行修改,值改为#
每个位置作为起点,调用helper函数,遍历整体判断【容易遗漏】
剑指offer3:
给一个数组,长度为n,数值范围是0-n-1找是否存在重复值
用hash表存储没有体现,题目特点,0-n-1特殊在数值和下标在有序情况下是有对应关系的,所以如果下标和元素不对应,就可以交换至该值所应存在的位置,如果该位置的数值本身和下标一致,则说明出现了重复数字
Function Usage Summary:
List 是模板类里对双向链表的实现
forward_list 单向链表
list function:
1.splice
three usage:if not specified add x after position
add it iterator after position or
函数有以下三种声明:
一:void splice ( iterator position, list<T,Allocator>& x );
二:void splice ( iterator position, list<T,Allocator>& x, iterator it );
三:void splice ( iterator position, list<T,Allocator>& x, iterator first, iterator last );
解释:
position 是要操作的list对象的迭代器
list&x 被剪的对象
对于一:会在position后把list&x所有的元素到剪接到要操作的list对象
对于二:只会把it的值剪接到要操作的list对象中
对于三:把first 到 last 剪接到要操作的list对象中
2.函数参数中出现& 不能用表达式的形式传参
eg:上面的参数加了& 不能用表达式相加的方式传参
void helper(vector<string>& ans,int left,int right,string& tmp)
helper(ans,left-1,right,tmp+"(");
但句子若改成
多了一个等号。相当于里面就是存储的变量而非表达式,但这样坏处是对tmp的值进行了改变,需要用pop_back()恢复 string用pop_back()删除最后一个元素
helper(ans,left-1,right,tmp+="(");
3.特殊条件的判断
边界条件 特殊输入 错误处理
字符串数值:空字符串,指针为空,带±,只带±,非法字符输入,溢出
查找数值:数组中包含/不包含/包含多个待查找数值,数组没有值,只有一个值
所需结果在数组中没有出现:找不到数,特殊处理
4.时间复杂度 插入 删除
unordered_map O(1) hash表
map O(logN) 红黑树