概述
提高自己如何把思维模式变成程序的过程。
#双向链表的头在0的索引处,
这样的话,用双向链表实现栈的时候,就是从0处入栈,从0处出栈
实现队列的时候,就是从0处入队,从s.len-1处出队
#deque 是双端队列
offer---insert; poll---remove; peak---examine
#面试常问问题:双向链表和单项链表的区别
区别主要在头结点,for遍历,有无前驱结点地址。
单向链表的头结点不是哑元(哑元的意思是能不能从头节点遍历,能则不是哑元),遍历的时候要第二次才能进入for循环,第一次需要去找表头,无前驱结点地址,只有后驱结点地址。双向链表头结点是哑元,遍历第一次就可以进入for循环,前后都有结点地址。
#堆
用完全二叉树维护一组数组,保证根节点是最大的/最小的
#coding quality
能分开做的事情,不要叠在一起做。
写代码不是说能一行写完的代码不写两行,而是如何写代码可以逻辑更清晰,便于解读。比如说图的拷贝当中,最好不要同时拷贝点和边。
#拓扑排序的作用
检测是否有循环依赖,比如import A; import B 如何A依赖B,B 也依赖A,那么这就是不合理的。
找到一种顺序,并按照这个顺序做事情是合理的。
#如何写递归?
递归要想清楚两件事:递归要干什么事情?什么时候return?
#subsets,组合类的问题。 回溯算法|递归实现, (隐式图)
本解法采用回溯算法实现,回溯算法的基本形式是“递归+循环”,正因为循环中嵌套着递归,递归中包含循环,这才使得回溯比一般的递归和单纯的循环更难理解,其实我们熟悉了它的基本形式,就会觉得这样的算法难度也不是很大。原数组中的每个元素有两种状态:存在和不存在。
① 外层循环逐一往中间集合 temp 中加入元素 nums[i],使这个元素处于存在状态
② 开始递归,递归中携带加入新元素的 temp,并且下一次循环的起始是 i 元素的下一个,因而递归中更新 i 值为 i + 1
③ 将这个从中间集合 temp 中移除,使该元素处于不存在状态
运算过程
代码注意的细节
result.add(new ArrayList<Integer>(subset));// 深度拷贝,因为subset在下面有remove和add操作
#深度优先搜索 找所有的方案,比如subset,permutation,一定是一个搜索题----深度优先搜索的题,不是宽度优先搜索。
时间复杂度:方案总数*构造一个方案的时间复杂度。比如:permutation的时间复杂度O(N!*N) ,subsets的时间复杂度为O(2^N*N)
#宽度优先搜索 深复制图;简单图的最短路径(什么是简单图: 一个结点有且仅有一条边,且权重为1) ,从一个状态变化到另一个状态,需要一步一步变化的。如word ladder
#insert interval 插入区间,
1、一个是插入什么数,还是一个是在哪里插入。
2、区间可能是在哪个位置,可能在前面(insertpostion++),后能在后面,可能是在中间(merge interval)。
#validate BST
BST 是二叉查找树,不是平衡二叉查找树,验证的时候只要保证保证做左子树的最大值比根节点小,右子树的最小值比根节点大。
#矩阵的dfs,关于连通图
参照链接http://www.cnblogs.com/grandyang/p/6686983.html?utm_source=itdadao&utm_medium=referral
#如果将'2'转换成2,直接 '2' - '0'就可以得到。
最后
以上就是强健柚子为你收集整理的算法笔记的全部内容,希望文章能够帮你解决算法笔记所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复