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) 红黑树

 

 

 

 

 

 

 

 

 

posted on 2020-10-30 10:39  黑暗尽头的超音速炬火  阅读(156)  评论(0编辑  收藏  举报