我是靠谱客的博主 强健柚子,最近开发中收集的这篇文章主要介绍算法笔记,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

提高自己如何把思维模式变成程序的过程。

#双向链表的头在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'就可以得到。

最后

以上就是强健柚子为你收集整理的算法笔记的全部内容,希望文章能够帮你解决算法笔记所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(67)

评论列表共有 0 条评论

立即
投稿
返回
顶部