- 博客(17)
- 收藏
- 关注
原创 leetcode 59.螺旋矩阵II
链接:https://leetcode.cn/problems/spiral-matrix-ii/solutions/12594/spiral-matrix-ii-mo-ni-fa-she-ding-bian-jie-qing-x/使用num
2024-08-21 11:17:27
312
原创 leetcode 189.轮转数组
这道题我们通过观察可以得知,这个数组可以被分为两个部分,先把第一个部分逆序,再把第二个部分逆序,最后整体逆序,就得到正确答案了。向右轮转 1 步: [99,-1,-100,3]向右轮转 2 步: [3,99,-1,-100]
2024-08-14 13:06:25
199
原创 leetcode 169多数元素
注意这个元素是大于n/2的,我们可以拿普通的元素和这个多数元素进行抵消,最后剩下的就是多数元素,所以我们只需要遍历数组一遍。,返回其中的多数元素。多数元素是指在数组中出现次数。
2024-08-03 21:34:09
127
原创 leetcode 84柱状图中最大的矩形
那么我们的大思路就是遍历一边整个heights数组,求得每个i位置的最大矩形,再用Math.max去PK,最后就能得到正确的答案。矩形的计算公式是底*高,高我们已经知道了是heights[i],那么这个底我们怎么知道呢?根据观察可以知道矩形的底取决于左边最近的比我当前位置小的i,右边最近的比我当前位置小的i。现在就差解决一个问题,那就是来到了i位置,怎么求得这个位置的最大矩形。那这就是一个单调栈模型(单调栈大压小,如果小压大,就结算栈顶位置)最大的矩形为图中红色区域,面积为 10。
2024-07-30 09:51:26
181
1
原创 leetcode 105从前序与中序遍历序列构造二叉树
所以定义递归函数TreeNode f(int[] preorder,int L1,int R1,int[] inorder,int L2,int R2)这里的while(true),每次都需要去遍历数组,是可以用HashMap做一个预处理优化的。代表:我给你前序的L1到R1,给你中序的L2到R2,你给我返回整棵树的根节点;这道题能把递归函数f()编出来那么题目就迎刃而解了。就有了下面的优化版本。
2024-07-29 10:51:53
175
原创 leetcode 118杨辉三角
定义一个row来装每一层的结果List row = new ArrayList();这道题其实就是找规律,从图中我们不难看出每一层的长度其实就是1,2,3,4.....所以有if判断if (j == 0 || j == i){row.add(1);再用 for (int j = 0;所以题目要求我们求numRows层的杨辉三角,那么最外层的循环就是。再继续观察我们发现每一层的规律就是第一个数和最后一个数必然是1。对于普遍位置,其实就是上一层当前位置的值,加上一个元素的值。
2024-07-28 14:37:00
210
原创 历史订单冷热分离方案
本项目除了将订单完成15日的订单迁移到历史订单数据库,还需要对订单数据进行分析,所以通过Canal+MQ将完成的订单(完成、取消、关闭)迁移到历史订单数据库,在历史订单服务对订单数据进行统计分析,并通过定时任务迁移冷数据。订单的冷热分离是指根据订单的特性和需求,将订单数据划分为冷数据和热数据,以便更有效地管理和优化数据存储、检索和处理的方式。将冷数据从主要的数据库中归档到较为廉价的存储介质,例如使用固态硬盘(SSD)存储热数据,而将冷数据存储在传统磁盘或云存储中,也可以使用低成本的云存储服务。
2024-07-27 19:38:23
301
原创 冗余数据同步方案
商品用户客户员工店铺仓库供应商这些数据修改后,需要同步到历史快照订单,发货单,订货单,采购单,调拨单,出库入库单等等....,之前的逻辑是直接在update接口里面加上synchronousUpdate方法,同步更新对应的表,有时候一个业务的update可能对应二十多张目标表,完全耦合在了业务里,接口执行的效率和代码的可维护性都不强生产是在Handler里做的。
2024-07-26 16:49:42
532
原创 leetcode 23合并k个升序列表
要对一个lists = [[1,4,5],[1,3,4],[2,6]]合并为一个升序列表。这道题我们需要一种动态的数据结构去拿到三个列表中的最小节点。那么小根堆就能解决这个问题。
2024-07-16 09:56:29
166
原创 leetcode 42接雨水
思路:这道题我们只需要从每个i去考虑,考虑每个i位置能接到多少雨水,把每个i位置接到的雨水相加,就得到了总共能接到的雨水。用通俗的话讲就是左边的最大和右边的最大取一个最小值,再减去我当前的i的高度,就得到了目前i位置能接到的雨水。仔细观察我们可以发现i位置能接多少雨水是由Math.min(leftMax,rightMax)决定的。那么每个i位置到底能接到多少雨水呢?
2024-07-16 09:44:10
227
原创 并发编程的三大特性
不同的硬件和不同的操作系统在内存上的操作有一定差异的。Java为了解决相同代码在不同操作系统上出现的各种问题,用JMM屏蔽掉各种硬件和操作系统带来的差异。让Java的并发编程可以做到跨平台。JMM规定所有变量都会存储在主内存中,在操作的时候,需要从主内存中复制一份到线程内存(CPU内存),在线程内部做计算。然后再写回主内存中(不一定!原子性的定义:原子性指一个操作是不可分割的,不可中断的,一个线程在执行时,另一个线程不会影响到他。i < 100;i++) {
2024-07-07 14:26:41
1026
原创 线程的基础概念
开销不同:毕竟进程和线程不是一个级别的内容,线程的创建和终止的时间是比较短的。:虽然多线程带来了一定的性能提升,但是再做一些操作时,多线程如果操作临界资源,可能会发生一些数据不一致的安全问题,甚至涉及到锁操作时,会造成死锁问题。如果在main线程中调用了t1.join(),那么main线程会进入到等待状态,需要等待t1线程全部执行完毕,在恢复到就绪状态等待CPU调度。不如要处理一个网络等待的操作,开启一个线程去处理需要网络等待的任务,让当前业务线程可以继续往下执行逻辑,效率是可以得到大幅度提升的。
2024-07-07 14:20:49
957
原创 CMS垃圾收集器
CMS(Concurrent Mark Sweep)收集器是一种以获取最短回收停顿时间为目标的收集器。CMS收集器主要用于要求低延迟(即:提高响应速度)的互联网项目。设置CMS收集器参数:-XX:+UseConcMarkSweepGC。采用的是"标记-清除算法",整个过程分为4步(1)初始标记 CMS initial mark 标记GC Roots直接关联对象,不用Tracing,速度很快(2)并发标记 CMS concurrent mark 进行GC Roots Tracing。
2024-03-12 16:59:32
1162
1
原创 Java中线程的常用方法
线程的线程体,当一个线程开始运行后,执行的就是run方法里面的代码,我们不能直接通过线程对象来调用run方法,因为这并没有产生一个新的线程,仅仅只是一个普通对象的方法调用。Java中提供了一个线程调度器来监控程序中启动后进入就绪状态的所有的线程,优先级高的线程会获取到比较多。start方法是我们开启一个新的线程的方法,但是并不是直接开启,而是告诉CPU我已经准备好了,快点运行我,这是启动一个线程的唯一入口。调用某线程的该方法,将当前线程和该线程合并,即等待该线程结束,在恢复当前线程的运行。
2024-03-06 16:38:47
449
原创 Java中实现多线程的几种方法
通过继承Thread类或者实现Runnable接口、Callable接口都可以实现多线程,不过实现Runnable 接口与实现Callable接口的方式基本相同,只是Callable接口里定义的方法返回值,可以声明抛出异 常而已。前面我们介绍的两种创建线程的方式都是重写run方法,而且run方法是没有返回结果的,也就是main方法是不知道开启的线程什么时候开始执行,什么时候结束执行,也获取不到对应的返回结果。创建Thread对象,并把第三部的Runable实现作为Thread构造方法的参数。
2024-03-02 12:06:33
386
原创 Java设计模式之工厂模式
抽象工厂类(Abstract Factory):定义了一组用于创建一系列产品对象的方法,这些方法返回抽象产品类型的对象。具体工厂类(Concrete Factory):实现抽象工厂类定义的一组用于创建一系列产品对象的方法,每个方法返回具体产品类型的对象。抽象产品类(Abstract Product):抽象产品类中的方法通常是抽象的。具体产品类(Concrete Product):每个具体产品类对应一个具体工厂类。// 抽象产品 A// 具体产品 A1@Override。
2024-02-04 14:15:57
414
1
原创 Java设计模式之单例模式
构造方法用private修饰,别人无法直接从外部创建对象,只能通过调用getInstance()的形式,这里我们不考虑暴力反射的情况。饿汉式不管用到与否,类装载时都会进行实例化,占用不必要的内存,优点是简单实用。
2024-02-03 19:14:18
267
1
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人