刷题笔记之动态规划(一)
动态规划五部曲
以LeetCode 509. 斐波那契数为例:
确定dp数组以及下标的含义dp[i]: 第i个数的斐波那契数是dp[i]
确定递推公式斐波那契数列的特点就是后一个数的值等于前两个数相加,所以不难推出:dp[i] = dp[i - 1] + dp[i - 2];
dp数组初始化这一步和确定dp数组以及下标的含义,翻译即可:
12dp[0] = 0;//第0个数的斐波那契数是0dp[1] = 1;//第1个数的斐波那契数是1
确定遍历顺序由于斐波那契数的后一个数是由前两个数相加而来,故应该从前往后遍历而且由状态转移式 dp[i] = dp[i - 1] + dp[i - 2]; 可以看出,dp[i]依赖 dp[i - 1] 和 dp[i - 2]
打印dp数组当i = 10 时,dp数组的结果应该是:0 1 1 2 3 5 8 13 21 34 55如果出现结果不符合预期的情况,就要检查递推公式或遍历顺序是否符合逻辑。
完整代码12345678910111213141516171819class Solution { public int f ...
多线程总结
进程和线程的区别
进程:一个内存中运行的应用程序,最常见的即为 .exe 为后缀的文件。
线程:进程中的执行单元。一个进程至少有一个线程,多个线程可以共享数据。它们的主要区别如下:根本区别 :进程是操作系统资源分配的基本单位,线程是CPU任务调度和执行的基本单位。资源开销 :每个进程都有独立的代码和数据空间(程序上下文),程序之间的切换会有较大的开销;线程可以看做轻量级的进程,同一类线程共享代码和数据空间,线程之间切换的开销小。包含关系 :如果一个进程有多个线程,则执行过程是多线程同步执行,执行的先后顺序取决于CPU的调度,线程也被称为轻量级进程。内存分配 :进程之间的地址空间和资源是相互独立的,而同一进程的线程共享本进程的地址空间和资源,且每个线程有自己的程序计数器、虚拟机栈和本地方法栈。影响关系 :一个进程崩溃不会对其他进程产生影响,但一个线程崩溃则会影响整个进程。执行过程 :每个独立的进程有程序运行的入口、顺序执行序列和程序出口,而线程不能独立执行。
线程的属性
线程编号(Id)
类型:long
作用:用于标识不同的线程。不同的线程有不同的编号。
注意事项:线程编号只在当前 ...
HashMap总结
HashMapJDK 1.8 以前JDK1.8 之前HashMap底层通过 数组和链表 结合。HashMap通过Key的hashcode经过扰动函数处理得到hash值,然后通过(n - 1) & hash判断当前元素的存放位置(n指数组长度),如果当前位置存在元素,就判断该元素与要存入的元素的hash值与key是否相同,如果相同直接覆盖,如果不同就通过拉链法解决冲突。
扰动函数就是HashMap的hash方法,使用hash方法可以减少哈希冲突。两个版本的hash方法如下:
12345678910111213141516171819//jdk 1.7static int hash(int h) { // This function ensures that hashCodes that differ only by // constant multiples at each bit position have a bounded // number of collisions (approximately 8 at default load facto ...
计算机网络总结
OSI七层模型应用层:为计算机用户提供服务表示层:数据处理(编解码、加密解密、压缩解压)会话层:管理(建立、维护、重连)应用程序间的会话传输层:为两台主机间的通信提供数据传输服务网络层:路由和寻址数据链路层:帧编码和误差纠正控制物理层:透明的传送比特流运输
TCP/IP四层模型
常见网络协议
应用层
HTTP,DNS,SSH…
传输层
TCP,UDP
网络层
IP,NAT,RIP,APR…
网络接口层
MAC,CSMA/CD…
HttpHTTP和HTTPS的区别
端口号:HTTP默认为80,HTTPS默认为443。
URL前缀:HTTP为http://,HTTPS为https://。
安全性:HTTP协议以明文方式传递信息,不提供任何加密,而HTTPS在HTTP基础上加了SSL/TLS协议,为浏览器和服务器之间的通信加密。在进行数据传输之前,对数据进行加密,再发到服务器。
网站申请流程:HTTPS协议需要额外申请证书,一般需要交费,Web服务器启动SSL需要获得一个服务器证书并将该证书与要使用SSL的服务器绑定。
搜索优先级:百 ...
栈和队列
栈栈简介
栈是一种特殊的线性表,它只允许在固定的一端(栈顶top)进行插入和删除操作,栈中的元素遵循LIFO(Last In First Out)原则。
栈的实现
在JDK中,栈的实现类是Stack,它的继承关系如下:从上图可以看到,Stack继承自Vector,Vector与ArrayList类似,都是动态的顺序表,不同的是Vector是线程安全的。
Stack中的常用方法如下:
方法
功能
Stack()
构造一个空栈
E push(E e)
将e入栈,并返回e
E pop()
将栈顶元素出栈并返回
E peek()
返回栈顶元素
int size()
返回栈中有效元素个数
boolean empty()
检查栈是否为空
常用方法时间复杂度:访问:O(n)插入删除:O(1)
栈的模拟实现栈常用数组或链表来实现,用数组实现的叫顺序栈,链表实现的叫链栈。这里我采用数组实现一个简易的栈。1234567891011121314151617181920212223242526272829303132333435363738394041424344 ...
祝我生日快乐!
今天是我的21岁生日,回首以往的20年,我依稀记得两次生日,第一次是12岁那年父母给我带了一个很大的蛋糕,第二次便是高三那年学习太过投入从而忘记了自己的生日,但我的几个好兄弟半夜一点踹开我们宿舍门来给我庆生。
今年我想送自己一个特别的礼物,于是便有了这个网站,制作过程工程量巨大,我爆改了数千行源码,几度想要放弃,浪费了大量学习的时间完成了这个网站,但我认为这些花费的时间意义非凡,在今后的三年甚至更久,我会一直在这里分享我所学到的技术。
我一直认为,人生在世倘若什么想法都只埋在心中,什么话都只跟自己说,那人生未免太过无趣,所以我乐于分享,就像这个网站一样,从今天开始,它不再只属于我自己,而是面向所有能访问到zer02.fun这个域名的人。
这将是我20年人生经历中最珍贵的礼物,很荣幸它来自我自己的双手以及群里很多大佬的帮助,在此我由衷感谢愿意回答我愚问的小伙伴。
目前我只发布了关于十大排序算法的博客,写了500行,目前还剩下桶排序和基数排序没有写,以后有时间再写吧(后续会把CSDN上写的又臭又长又烂的博客逐渐优化并转移过来)。感兴趣的小伙伴可以去看看,如果可以的话,请在文末的评论区对我 ...