笔记:代码随想录
数组
概念
存放在连续内存空间上相同类型数据的集合(内存地址、字符数组、下标)。
python中称为列表。
C++要注意vector 和 array的区别,vector的底层实现是array,严格来讲vector是容器,不是数组。
特点
数组元素不能删除,只能覆盖。
方法
1.二分法
条件:(1)有序数组;(2)数组中无重复元素。
思路:循环不变量(确定好是左闭右闭还是左闭右开)。
2. 移除元素
3. 有序数组的平方
双指针法
条件:数组、链表、字符串
思路:快指针,寻找新数组的元素,新数组就是不含目标元素的数组;慢指针,指向更新新数组下标位置。
4.长度最小的子数组
滑动窗口
定义:不断调节子序列起始位置和终止位置,得到想要的结果。
不要以为for里放一个while就以为是O(n^2)啊, 主要是看每一个元素被操作的次数,每个元素在滑动窗后进来操作一次,出去操作一次,每个元素都是被操作两次,所以时间复杂度是 2 × n 也就是O(n)。5. 螺旋矩阵
模拟
链表
概念
通过指针串联在一起的线性结构,每一个节点由两部分组成,一个数据域一个指针域(存放指向下一个节点的指针),最后一个节点的指针指向null(空指针)。(内存地址、数据域、指针域)
链接的入口节点称为链表的头节点(head)。
特点
非连续分布
其他
单链表:只指下。
双链表:每一个节点有两个指针域,指上指下(可向前向后查询)。
循环链表:链表首尾相连(可以解决约瑟夫环问题。)
数组:数据量固定,频繁查询,较少增删。
链表:数据量不固定,较少查询,频繁增删。
单链表节点具备两个属性:val和next,val是当前节点的值,next是指向下一个节点的指针/引用。双向链表还需要一个属性prev以指示链表中的上一个节点。
删除某个节点时,C++里最好是再手动释放这个节点,释放这块内存。其他语言例如Java、Python,就有自己的内存回收机制,就不用自己手动释放了。
方法
1.移除链表元素
思路:使用虚拟头结点。
2.设计链表
class ListNode:
def __init__(val = 0, next = None):
self.val = val
self.next = next
3.翻转链表
思路:迭代法,递归法
4.两两交换链表中的节点
5.删除链表倒数第N个节点
思路:双指针法
6.链表相交
7.环形链表
思路:从头结点出发一个指针,从相遇节点也出发一个指针,这两个指针每次只走一个节点, 那么当这两个指针相遇的时候就是环形入口的节点。