- 博客(21)
- 收藏
- 关注
原创 力扣142题-寻找环形链表的入口
推导后可以得到这个关系:a = (n - 1)(b + c) + c (此时必然满足 n >= 1 的条件,因为快指针追上慢指针的时候必然在环中移动了不少于 1 圈)注意,快指针每一次跳动两个节点,而慢指针每次跳动一个节点,否则存在快指针永远无法和慢指针在环中相遇的可能。则两个慢指针同时分别从 head 和快慢指针相遇点同时出发的话,它们必然在环的起点相遇。快指针的速度是慢指针的 2 倍,当快慢指针相遇的时候,有这个等式:\。
2025-03-31 09:00:00
279
原创 力扣209-长度最小的字数组-滑动窗口
为例进行思考,使用暴力算法时,当遍历到第 2 个元素 “1” 时,字数组 [1, 2, 4, 3] 要被取出进行比较,当遍历到 第 3 个元素 “2”时,字数组 [2, 4, 3] 也要被取出进行比较,但是只要取出后者进行比较即可,因为后者是前者的字数组,为了得到后者还需要遍历一边数组就明显的造成了资源的浪费。这道题的暴力解法是遍历每一个元素,在遍历的过程中将符合条件的字数组的长度记录下来,然后返回最小的长度。如此就将原本暴力算法的 o(n^2) 的时间复杂度优化为了 o(n) 的时间复杂度。
2025-03-28 09:00:00
355
原创 力扣第59题-螺旋矩阵-边界条件
同时要考虑这样的填写要填写多少次,使用一个数 loop 来记录已经填写了几圈,而要填写的次数应当是 n / 2,只是要注意,当 n 为奇数时,最中心的一个元素是不会被填写的,要手动填写。这要就要引入一个数 offset 来保证矩阵的“当前边”上的最后一个数字不会被填写,而是留到了下一条“边”的填写。每一圈都应该从 startX 和 startY 的坐标位置开始填写,每填写一圈,这两个数字都应该各自增大 1。这道题的难点是如何将一周的矩阵元素按照一个固定的守则填入矩阵。
2025-03-28 09:00:00
281
原创 利用前缀和求区间和
此时存在优化的方法,那就是建立一个长为 n + 1 的前缀和数组,从位置 1 开始将把原数组元素求和的值放入相应位置(例如原数组中的位置 1 对应前缀和数组的位置 2,前缀和数组位置 2 的值为原数组从位置 0 到 位置 1 即[0, 1]区间内元素的和)。这样每次求和的时间复杂度就下降到了o(1),这题算法的时间复杂度下降为o(m + n),即只需要在建立前缀和数组的时候遍历一次数组,而不是每次求和都要遍历数组。假设数组的长度为 n, 查询的次数为 m。
2025-03-28 09:00:00
108
原创 一维前缀的应用-开发商购买土地
遍历数组的第一列,来获取[0, k] 和 [k + 1, n] 的差值。假设第一列的总和为 sum,[0, k] 的总和为n,则 [0, k] 和 [k + 1, n] 的差值为 n - (sum - n) 的绝对值,即Math.abs(sum - 2 * n)。得到第一行和第一列后即可套用 Math.abs(sum - 2 * n) 来获取当前的分割差值,并获取最小的差值。这道题也可以用二维前缀和来求解,之后我有时间再进行补充。
2025-03-28 09:00:00
150
原创 #### 力扣27-移除元素-双指针法
我观察到数组元素的移除要改动一系列的元素,似乎可以从这个方向上优化这个算法。我可以尝试使用双指针法,用慢指针标识出左侧的已经过筛选的元素,用快指针标识出下一个要识别的元素。一看到这道题,我的第一想法就是遍历数组,然后将与 val 相等的元素移除。将数组遍历的时间复杂度为 o(n) ,将数组中的某一个元素移除的时间复杂度也是o(n),则暴力遍历的时间复杂度为o(n^2)。这样我就把移除数组元素的时间复杂度从 o(n) 变成了 o(1),算法的时间复杂度变为了 o(n)。
2025-03-27 09:00:00
124
原创 力扣977-有序数组的平方-双指针法
那么我要思考可以从什么角度对算法进行优化,我要找这道题的规律。首先,这道题的数组是有序的,在平方后则是失去了有序性。但是还是存在一定的规律,即在原数组只有正数或是只有负数的时候,数组依然是有序的,在原数组既有负数又有正数的时候,数组呈现一个“凹”形的状态,即两边高中间低。这样三种情况就呈现出了一个统一的规律性,即可以用指针从两端向中间逼近获取剩余元素中最大的元素。从后向前将当前最大的元素填进数组即可获得一个生序排序的数组。这道题首先可以使用暴力解法来解决,只需要遍历数组将其每一个元素平方并进行排序即可。
2025-03-27 09:00:00
145
原创 力扣35-搜索插入位置
因此可以将数组分成两个部分,左部分是小于 target 的值,右部分是 大于等于 target 的值。这道题数组中的元素具有二段性,可以采用二分法,利用 left 和 right 逐渐逼近结果值并且在结果值处会合。这道题可以转化为寻找数组中最小的大于等于 target 的值的位置。这道题要注意以下细节:(n 为数组长度)
2025-03-27 09:00:00
149
原创 一些关于锁的策略的概念
之前专栏的文章中,synchronized 锁已经是我们的老朋友了,那么它又遵循哪些锁策略来执行的呢?乐观锁/悲观锁“自适应”轻量级锁/重量级锁“自适应”自旋锁/挂起等待锁“自适应”不是读写锁非公平锁可重入锁接下来我来简单介绍一下 synchronized 的机制,来解释清楚之前提到的“自适应”是怎么一回事。偏向锁阶段轻量级锁阶段重量级锁阶段偏向锁阶段:偏向锁加锁并不是真的加锁了,而是对锁进行了一个简单的标记。
2024-11-07 09:00:00
1447
原创 使用 Callable 接口初始化线程
现在我实际上希望获得 count 的值,但是 run 方法的返回值为空,所以我必须要再单独把 count 设定为一个成员变量。那么有没有方法来让我们直接以返回值的方式来获得 count 的值呢?Callable 接口能完成的任务也可以被 Runnable 接口完成,这里只是为大家提供了另一种初始化线程的方式,大家做了解即可。
2024-11-07 09:00:00
193
原创 设计模式:线程池
线程池是一种多线程管理机制,用于有效地管理和复用线程资源。通过预先创建一定数量的线程并将它们放入线程池中,可以避免频繁的创建和销毁线程,从而提高程序的运行效率。在需要执行任务时,线程池会分配一个空闲的线程执行任务。任务完成后线程不销毁,而是返回池中等待下一个任务的调用。线程创建具有较高的成本,线程池中复用线程的调用相对直接创建线程的系统资源开销和延迟都更低线程频繁的销毁会使内存碎片化,使用线程池不会频繁的删除线程而使内存碎片化,提高了内存的使用效率。
2024-11-01 09:00:00
624
原创 设计模式:JAVA 中定时器的简介和模拟实现
定时器时软件开发中的一个重要的组件,使程序在达到某一个设定的时间后就执行某一个设定好的代码。JAVA 中的标准库中提供了一个 Timer 类,利用 schedule 方法来设定任务和任务的启动时间。schedule 包含两个参数,第一个参数指定即将要执行的任务代码,第二个参数指定多长时间以后任务开始执行(单位是毫秒)。
2024-10-30 09:00:00
746
原创 设计模式:阻塞队列,生产者-消费者模型
这张图是生产者-消费者模型的基本示意图。生产者-消费者模式通过引入一个容器来解决生产者和消费者的强耦合问题。生产者和消费者彼此之间不直接通讯,而是通过阻塞队列来进行通讯。生产者生产数据后直接将其放入阻塞队列中;消费者需求数据时直接从阻塞队列中取数据。阻塞队列相当于一个缓冲区,平衡了消费者与生产者之间的处理能力阻塞队列使得生产者与消费者解耦解耦(Decoupling)是指在系统设计中,将不同组件、模块或子系统之间的依赖关系降低,使它们能够独立运作和变化。
2024-10-29 09:00:00
1241
原创 利用 wait 方法和 notify 方法协调多个线程间的执行先后顺序
由于抢占式执行,线程之间执行的先后顺序无法预测。为了合理协调多个线程之间执行的先后顺序,我们引入 wait(),notify() 和 notifyAll() 这三个方法完成协调工作。
2024-10-27 09:00:00
810
原创 多线程编程的安全问题及其解决方法
经过了专栏的前几期的讲解,想必大家已经对多线程有了一些概念了,很多朋友一定已经想要进行多线程编程了。所以,我们开始第一步,运行上述代码,可以得到如下结果:大家的结果不一定是这个数字,但不会是正常应该得到的 1_000_000。那么这是为什么呢?为了更好的帮助大家进行理解,我要介绍关于的概念。表示一个操作是的,即该操作要么,要么。上述的代码无法得到应有的结果,就是因为 count++ 的操作不是一个具有原子性的操作。这三个操作可能会因为并发执行被随意地打断。
2024-10-26 09:00:00
1979
原创 线程的状态以及状态之间的转化
线程的状态是一个枚举类型,我们使用如下代码直接在编译器中观察到线程都有哪些状态。使用以上的代码,可以打印出线程的各种状态,包和这六种状态。
2024-10-22 14:31:52
567
原创 关于 Java 中 Thread 类的简要介绍
在之前的文章中,我简单介绍了如何在主线程中利用类创建新的线程。在解决了创建线程的问题后,我现在要对重要的进行一个简要的介绍来帮助大家更加深入的理解Java中的线程。
2024-10-17 22:00:00
753
原创 关于Java中多线程初始化的方法
最近学习了Java中多线程的初始化方法,于是我便走进了csdn,便排在桌上几枚大钱,温上一壶好酒,来和大家分享一下Java多线程初始化线程的方法。
2024-10-15 19:14:51
958
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人