学习内容:数组与链表、计算机网络知识
数组:
从数组的基础知识到相关应用
数组的基础知识:数组在内存中的存储、数组的相关操作(获取与更新)、数组的相关应用:
二分查找法⭐⭐⭐⭐⭐
● 掌握左闭右闭的循环条件和处理条件: 当left = 0, right = n - 1的时候因为right这个值我们在数组中可以取到,while(left <= right) 是正确写法 主要看能不能取到这个值,关于mid:每次取mid加减一即可
● 二分的最大优势是在于其时间复杂度是O(logn),因此看到有序数组都要第一时间反问自己是否可以使用二分。
● 关于二分mid溢出问题解答:
○ mid = (l + r) / 2时,如果l + r 大于 INT_MAX(C++内,就是int整型的上限),那么就会产生溢出问题(int类型无法表示该数)
○ 所以写成 mid = l + (r - l) / 2或者 mid = l + ((r - l) >> 1) 可以避免溢出问题
移除元素⭐⭐⭐⭐⭐
● 掌握双指针处理数组的思想:利用快慢指针解题,fast找非删除元素的值,slow记录非删除元素的值(即新数组中需要存储的元素)
● 双指针与暴力破解:双指针对于暴力破解上是使用空间换时间。
● fast < nums.size() 和 fast <= nums.size()-1 没什么区别,那为什么第二个会在空数组时报数组越界的错误?
vector的size()函数返回值是无符号整数,空数组时返回了0,再减个一会溢出
有序数组的平方排序⭐⭐⭐⭐
● 掌握使用双指针(快慢指针)+滑块思想:快指针的移动条件:慢指针到快指针范围内元素和小于或大于等于目标元素;慢指针移动条件:慢指针到快指针范围内元素之和大于等于或小于目标元素,且每次需要记录慢指针到快指针的元素个数并进行判断,取最小或最大长度即可(即数组序列长度)。
● 双指针和滑动窗口有什么区别
滑动窗口也是基于双指针完成的,但滑动窗口是会连续处理某一种情况。具体区别:
因为两头指针走完相当于最多只把整个数组遍历一遍,会漏掉很多情况。滑动窗口实际上是双层遍历的优化版本,而双指针其实只有一层遍历,只不过是从头尾开始遍历的。
滑动窗口的原理是右边先开始走,然后直到窗口内值的总和大于target,此时就开始缩圈,缩圈是为了找到最小值,只要此时总和还大于target,我就一直缩小,缩小到小于target为止在这过程中不断更新最小的长度值,然后右边继续走,如此反复,直到右边碰到边界。这样就保证了可以考虑到最小的情况
螺旋矩阵II⭐⭐⭐⭐
● 关于offset不太好理解:offset的意义在于 结束一圈后 起始位置向后移 结束位置向前移。可以画和n=4或者n=5的矩阵,会比较好理解。offset就是由于要去更向内的一圈,内圈元素更少的地方循环,所以循环的次数变少了
相关题目:
704. 二分查找、27. 移除元素
977.有序数组的平方 209.长度最小的子数组 59.螺旋矩阵II
链表
从链表的相关知识到相关应用
链表的急促知识:链表的存储、分类、如何定义、链表的操作(查找节点、更新节点)、给出一个数组如何转化陈链表
移除链表元素⭐⭐⭐⭐
●引入虚拟头节点:虚拟头结点的主要目的是为了避免对头结点的特殊处理;这个处理就指的是修改操作,查询操作使用于不适用虚拟头节点没啥区别
●修改链表时需要判断移动元素后是否会出现空指针异常的情况
● 空针异常优先在节点前debug判断一下是否为null来定位!
● 关于递归来做这道题 可以看看这边博客的思维:https://lyl0724.github.io/2020/01/25/1/
设计链表⭐⭐⭐⭐⭐
● 该题目主要考察链表的所有相关知识,如链表的插入数据、获取数据、删除数据的相关操作,因此这道题目的重要程度为⭐⭐⭐⭐⭐
● 题目中需要引入链表长度记录的变量,方便链表在进行插入和删除时进行操作
反转链表⭐⭐⭐⭐⭐
● 反转操作时一定要记录待断指针所执行的节点,以防后续节点丢失
● 为什么有时候需要判定cur->next !=nullptr 有时候又不需要 只用判断cur!=nullptr呢?
其实这个要看场景,一般就是看你如果不判断的话会不会导致空指针异常,因为如果你的指针遍历到null还调用它的属性或方法肯定就会报错的,但是有时候的情况不会遍历到cur->next,所以要看具体情况。
两两交换链表中的节点 ⭐⭐⭐⭐
本题难点在于:
- while循环条件
- 使用两个临时节点指向待断指针指向的节点
- https://lyl0724.github.io/2020/01/25/1/ 里面有递归的题解 很好的博客
删除链表的倒数第N个节点⭐⭐⭐⭐⭐
● 掌握了删除倒数第n个元素时如何引入双指针进行解决
难点在于:要使得慢指针指向待删除节点的上一个节点
链表相交⭐⭐⭐⭐
理解节点和节点值的区别: 节点是一个实例 占用一块空间 值只是它的成员变量 值怎样和节点本身没有任何关系 一个实例只由它的地址唯一确定
思路:使得两个链表尾部对齐,在进行查找
环形链表II⭐⭐⭐⭐
利用数学和物理知识进行解决,善于发现和总结
本体理解上需要手动模拟进行总结其中的规律
相关题目:
203.移除链表元素 、707.设计链表、206.反转链表
24. 两两交换链表中的节点 、19.删除链表的倒数第N个节点、面试题 02.07. 链表相交、142.环形链表II