• Redis:跳表

    Redis的ZSet类型底层用到了跳表,来支持平均复杂度的节点查找。

    需要注意的是,Redis使用跳表时,实际用了跳表和哈希表双份保存,来分别支持高效的范围查找和单点查询(哈希表不支持有序)。

  • 设计模式学习笔记

    设计模式是对软件设计问题常见问题的通用解决方案,使用设计模式可以提高代码的可读性、可维护性和复用性。此外,设计模式还为设计决策提供了共同的语言和框架。

    一般来说,设计模式可以分为三类:创建型模式、结构型模式、行为模式。

    • 创建型模式提供了对象创建和使用分离的机制。
    • 结构型模式关注对象和类如何组装成更大结构的方式。
    • 行为模式负责对象之间的沟通协作和职责委派。

    学习资料:设计模式目录:22种设计模式图说设计模式 — Graphic Design Patterns

  • Java函数式编程

    函数式编程是一种“编程范式”,以函数为基本构建单元。在这种范式中,函数可以作为参数传递给其他函数、作为返回值返回,或赋值给变量。

    由于Java不支持单独定义函数,我们可以将静态方法视为独立的函数,将实例方法视为自带this参数的函数。(from 函数式编程 - Java教程 - 廖雪峰的官方网站

    Java8引入了对函数式编程的支持,主要包括以下几个方面:

    • 函数式接口:允许在方法中传递行为。
    • Lambda表达式:允许用简洁的方式来表示函数,简化了匿名内部类的写法。
    • Stream API:支持对集合进行函数式操作,如过滤、映射、聚合等,并且支持使用并行流提高性能。
    • Optional:用于处理可能为null的值,避免NullPointerException
  • Java多线程:AQS&线程池

    ReetrantLock实现了Lock接口 lock() 加锁 lockInterruptibly() 响应中断的加锁 tryLock() 尝试获取锁,非阻塞的获取锁 unlock() 解锁 lock:snyc.lock sync是Sync抽...
  • LeetCode刷题笔记:图论相关

    Floyd算法可以求任意两点之间的最短距离(多源最短路径),核心思想是将每个点作为中间点去更新最短路径。

    Dijkstra算法可以求一个点到其他点之间的最短距离(单源最短路径)。

  • LeetCode刷题笔记:滑动窗口

    滑动窗口算法的核心思想是通过两个指针来定义一个窗口,通过动态调整窗口大小和位置来求解问题。

    通常用于解决子数组、子串、子序列相关问题,比如:最大最小子数组(最大子数组和)、(包含所有字符的/无重复字符的)子字符串、定长子数组的最大/小值、滑动窗口平均值。

  • LeetCode刷题笔记:数组&双指针

    双指针双指针算法是一类用2个指针遍历数组或链表的算法,通常用来解决在数据中进行搜索、排序、匹配的问题。 同向双指针同向双指针也可叫快慢双指针,一般慢指针每次移动一步,快指针则移动两步或更多步。 一般用来解决链表问题。 用在数组中,可以解决有序数组...
  • LeetCode刷题笔记: 回溯&贪心&动态规划

    回溯就是暴力穷举,是一种搜索方式,其核心思想是从一个初始状态出发,深度优先搜索遍历所有可能的解决方案(解空间),如果确定某种方案不可行就回溯到上一步重新搜索。一般用来解决组合问题(无序)、子集问题(无序)、排列问题(有序)、字符串切割问题、棋盘问题等。

    贪心算法的思想是在每个决策阶段,选择局部最优解,以此获取全局最优解。

    动态规划

  • LeetCode刷题笔记:栈&单调栈&单调队列

    栈是一种「先进后出」的数据结构。单调栈是一种特殊的栈,在满足「先进后出」规则基础上,同时满足「从栈底到栈顶的元素单调递增/减」,因此也分为单调递增栈,单调递减栈。

    单调栈用来解决下一个更大/小元素上一个更大/小元素这一类的典型问题。比如739. 每日温度84. 柱状图中最大的矩形42. 接雨水都是这类问题。

    队列是一种「先进先出」的数据结构。单调队列是一种特殊的队列,在满足「先进先出」规则基础上,同时满足「从队首到队尾的元素单调递增/减」。

    单调队列用来解决滑动窗口内的最大/小值中位数的动态查询这一类问题。比如239. 滑动窗口最大值

  • Docker + Nginx部署前端项目

    后端部署可以查看:GitHub Actions & Docker实现自动化部署 | Jin’s Blog (isjinhu.github.io)

/2