算法通关 4 - 栈专题
栈专题—栈基础
通关进度
题目
说明
数组栈
通关
链表栈
通关
参考资料
一网打尽队栈结构
数组栈123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354public class AStack<T> { // 栈结构 private T[] stack; // 栈顶指针 private int top; //构造函数 public AStack() { // 以下行会导致编译时错误 // private T[] array = new T[10]; 泛型擦除 this.stack = (T[]) new Object[10]; } // 判空 public boolean isEmpty() { return top == 0; } ...
算法通关 3 - 数组专题
数组专题—数组基础
内容概览
题目
说明
在数组首部、中间和尾部插入元素
简单
在数组首部、中间和尾部删除元素
简单
单调数列
中等
搜索插入位置
困难
合并两个有序数组
简单
参考资料
常见数据结构1.别说你懂数组-这些问题经常翻车
数组基本操作
数组创建和初始化
12345int[] arr = new int[10];int[] arr = new int[] {0,1,2,3,4};int[] arr = {0,1,2,3,4};
查找元素
123456789101112131415/** * 查找元素 * * @param size 已经存放的元素个数 * @param key 待查找的元素 */public int find(int[] arr, int size, int key) { for (int i = 0; i < size; i++) { if (arr[i] == key) { retu ...
算法通关 2 - 链表专题Ⅱ
链表专题Ⅱ—反转基础 206. 反转链表
内容概览
题目
说明
带虚拟头节点的链表反转
通关
不带虚拟节点的链表反转
通关
题目
【LeetCode 206】:给你单链表的头节点 head ,请你反转链表,并返回反转后的链表。
参考资料
链表3.透彻理解链表反转以及拓展问题链表6:大厂如何考链表反转
【基础】建立虚拟头节点辅助反转
123456789101112131415161718192021// 带有虚拟节点的反转public ListNode reverseList(ListNode head) { // 接上虚拟节点解决问题 ListNode L = new ListNode(-1); L.next = head; // 断链操作,为头插法做铺垫 L.next = null; // 当前指针 p ListNode p = head; while (p != null) { // 后继指针 ListNode q = p.next; / ...
算法通关 1 - 链表专题Ⅰ
总结
常见的数据结构: 数组、链表、栈、队列、哈希、树、堆
常用的算法思想: 查找、排序、双指针、递归、迭代、分治、贪心、回溯、动态规划
链表专题Ⅰ—链表基础
内容概览
题目
难度
链表遍历
简单
链表插入
简单
删除链表
简单
链表头插法
简单
链表尾插法
简单
参考资料
1.Java 是如何构造链表的
2.一道题透彻理解链表是什么
3.闭着眼都要会—链表增删改查
4.大厂都是如何如何考链表的
5.手写小红书考过的的链表求并集算法
单链表单链表包含若干节点,每个节点具有指向后继结点的 next 指针,最后一个节点的 next 指向 NULL。
正确示范
错误示范
虚拟节点和头节点
节点和头节点
链表中每个节点都由值和指向下一个节点的地址组成,对于单链表,第一个元素节点称为头节点
虚拟节点
即 dummyNode,其 next 指针指向 head
如果获取 head 节点,或者从方法里返回时,使用 dummyNode.next
dummyNode 的 val 不会被使用,通常初始化成 0 或 -1
创建链表
J ...
算法通关- 0 通关热身
准备和应对算法
平时如何刷算法
根据专题进行分类刷题
面试如何应对算法
理解问题,复述问题进而明确问题
进一步确认问题,大胆说出想法,逐步找到最优想法
初步设计,先写整体,再考虑边界
测试检验,评判性能,优化解法
数据结构与算法基础
数据结构类型
进度安排
体系脉络
时间和空间复杂度时间复杂度常数阶:一般顺序执行并且只执行一次的代码。
1234sum = sum + 1;sum = sum + 2;sum = sum + 3;sum = sum + 4;
线性阶:执行的次数随着问题规模是线性变化的。
123for (int i = 0; i < n; i++) { // todo}
平方阶:主要是双层嵌套循环。
12345for (int i = 0; i < n; i++) { for (int j = 0; j < n; j++) { // todo 时间复杂度为 1 的程序 }}
对数阶
1234567int count = 1;int n ...
JUC-12-StampedLock
ReentrantReadWriteLock读写锁定义:一个资源能够被多个读线程访问,或者被一个写线程访问,但是不能同时存在读写线程。
它只允许读读共存,而读写和写写依然互斥,大多实际场景读读线程间并不存在互斥关系,只有读写线程或写写线程间的操作需要互斥。
一个ReentrantReadWriteLock同时只能存在一个写锁但是可以存在多个读锁,但不能同时存在写锁和读锁,即一个资源可以被多个读操作访问―或一个写操作访问,但两者不能同时进行。
特点
可重入
读写兼顾
锁降级
ReentrantReadWriteLock锁降级:将写入锁降级为读锁,锁的严苛程度变强叫做升级,反之叫做降级。
如果同一个线程持有写锁,在没有释放写锁的情况下,它还可以继续获得读锁。这就是写锁的降级,降级成为读锁
将写锁降级为读锁:遵循获取写锁、获取读锁再释放写锁的次序,写锁能够降级为读锁
如果释放了写锁,那么就完全转换为读锁。
读锁升级到写锁是不可能的
如果有线程在读,写线程需要等待读线程释放锁后才能获取锁
写锁和读锁互斥
写锁和读锁是互斥的(是指线程间的互斥,当前线程可以获取到写锁 ...