滑动窗口
滑动窗口主要用来处理连续问题。比如题目求解“连续子串 xxxx”,“连续子数组 xxxx”,就应该可以想到滑动窗口。
时间复杂度一般是 O(N + K) K是窗口大小
从类型上说主要有:
固定窗口大小
窗口大小不固定,求解最大的满足条件的窗口
窗口大小不固定,求解最小的满足条件的窗口
固定窗口例如:
可变窗口例如:1004. 最大连续1的个数 III
12345678910111213public int longestOnes(int[] A, int K) { int res = 0; int l = 0, r = 0,count = 0; while(r<A.length){ count += A[r] == 0 ? 1 : 0; while(count > K){ count -= A[l++] == 0 ? 1 : 0; } res = Math.max(re ...
代理模式
适用范围:
为其他对象提供一个代理以控制对某个对象的访问。代理类主要负责为委托了(真实对象)预处理消息、过滤消息、传递消息给委托类,代理类不现实具体服务,而是利用委托类来完成服务,并将执行结果封装处理。
例如:我们要去买火车票
抽象接口:都是卖票的
被代理对象:12306官方售票
代理对象:各种第三方代理售商
用户去使用第三方代理买票,本质上就是实现了代理—-通过对代理类的访问控制被代理对象
三种常用动态代理
静态代理
jdk动态代理
cglib动态代理
1.静态代理
创建一个接口,然后创建被代理的类实现该接口并且实现该接口中的抽象方法。之后再创建一个代理类,同时使其也实现这个接口。在代理类中持有一个被代理对象的引用,而后在代理类方法中调用该对象的方法。
接口:
123public interface SaleTicket { void sale(int money);}
被代理类:
12345678910public class SaleBy12306 implements SaleTicket{ public void ...
Jvm底层原理总结
Java 虚拟机底层原理知识总结清单
JVM 内存结构
HotSpot 虚拟机对象探秘
垃圾收集策略与算法
HotSpot 垃圾收集器
内存分配与回收策略
JVM 性能调优
类文件结构
类加载的时机
类加载的过程
类加载器
java 虚拟机底层原理知识总结
纯洁的微笑jvm
线段树
线段树
线段树是算法竞赛中常用的用来维护 区间信息 的数据结构。
线段树可以在 的时间复杂度内实现单点修改、区间修改、区间查询(区间求和,求区间最大值,求区间最小值)等操作。
线段树维护的信息,需要满足可加性,即能以可以接受的速度合并信息和修改信息,包括在使用懒惰标记时,标记也要满足可加性(例如取模就不满足可加性,对 取模然后对 取模,两个操作就不能合并在一起做)。
1.区间求和的线段树
若只需要求区间和,而不需要改变区间值 —> 使用前缀和
若在求区间和的基础上,还要修改区间数组的值,为了更快的维护一个前缀和数组 —-> 线段树
线段树实际就是在前缀和的基础上使用二分构建二叉搜索树,提高修改区间值的时间
线段树一般支持三个基本操作:构建树,修改某元素的值,查询区间和
如图:原数组和它对应的线段树
修改下标为4的元素为6后的线段树:
一个区间求和线段树的Java基本模板:
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535 ...
java反射机制
java反射机制
反射就是在运行时才知道要操作的类是什么,并且可以在运行时获取类的完整构造,并调用对应的方法。
通俗理解:当我们的程序在运行时,需要动态的加载一些类这些类可能之前用不到所以不用加载到jvm,而是在运行时根据需要才加载。例如:大家如果接触过spring,会发现当你配置各种各样的bean时,是以配置文件的形式配置的,你需要用到哪些bean就配哪些,spring容器就会根据你的需求去动态加载,你的程序就能健壮地运行。
反射机制
Reflection 使用 JDK 提供的反射 API 进行反射调用类的信息
反射就是在运行时才知道要操作的类是什么,并且可以在运行时获取类的完整构造,并调用对应的方法。
正常使用类
引入包
new实例化
获取实例化对象
12Apple apple = new Apple(); //直接初始化,「正射」apple.setPrice(4);
反射
一开始并不知道初始化的类对象是什么
无法使用 new 关键字来创建对象
使用 JDK 提供的反射 API 进行反射调用
12345Class clz = Class.forName(" ...
java并发编程小结
参考资料:深入浅出Java多线程廖雪峰的官网
一、并发基础1.线程与进程进程:单独占有一定的内存地址空间,数据隔离,数据共享复杂,同步复杂。稳定但资源开销大。
线程:共享进程的内存资源,数据共享简单,同步复杂。可靠性低但资源开销小。
线程并非越多越好,线程越多,上下文切换越多,消耗大量的CPU时间。
2.多线程入门和接口1.Thread类
继承Thread类,并重写run方法;
2.Runnable接口
实现Runnable接口,并重写run方法;
3.Callable接口
Callable一般是配合线程池工具ExecutorService来使用的。有返回值
4.Future接口
拥有取消,获取线程状态的功能。有返回值
5.FutureTask类
同时实现Runnable和Future接口。有返回值
3.线程组和线程优先级1.线程组:
使用线程组对线程进行批量控制。线程组是一个标准的向下引用的树状结构。
2.线程优先级:
Java中线程优先级可以指定,范围是1~10。
Java默认的线程优先级为5,线程的执行顺序由调度程序来决定,线程的优先级会在线程被调用之前设定。
...
java注解
餐考资料:注解解析注解用途
1.注解的实质
所有的注解类型都继承自这个普通的接口(Annotation)
如, @Override 的定义,其实它本质上就是:
123public interface Override extends Annotation{ }
2.元注解
『元注解』是用于修饰注解的注解,通常用在注解的定义上
@Target:注解的作用目标
@Retention:注解的生命周期
@Documented:注解是否应当被包含在 JavaDoc 文档中
@Inherited:是否允许子类继承该注解
@Target 用于指明被修饰的注解最终可以作用的目标是谁,也就是指明,你的注解到底是用来修饰方法的?修饰类的?还是用来修饰字段属性的。
我们可以通过以下的方式来为这个 value 传值:
@Target(value = {ElementType.FIELD})
被这个 @Target 注解修饰的注解将只能作用在成员字段上,不能用于修饰方法或者类。
其中,ElementType 是一个枚举类型,有以下一些值:
ElementType.TYPE: ...
动态规划模板
动态规划分类:
线性dp
区间dp
背包dp
树形dp
状态压缩dp
数位dp
计数型dp
递推型dp
概率型dp
博弈型dp
记忆化搜索
动态规划思考方式:
1.线性dp
线性 DP 问题是指递推方程具有明显的线性关系,有一维线性和二维线性。
如:
三角形最小路径和
1234567891011public int minimumTotal(List<List<Integer>> triangle) { int len = triangle.size(); int[] dp = new int[len+1]; for (int i = len-1; i >=0 ; i--) { for (int j = 0; j <=i ; j++) { int num = triangle.get(i).get(j); dp[j] = Math.min(dp[j],dp[j+1]) + num; } } ...
回溯模板
回溯12345678910result = []def backtrack(路径, 选择列表): if 满足结束条件: result.add(路径) return for 选择 in 选择列表: 做选择 backtrack(路径, 选择列表) 撤销选择
如LeetCode第46题,全排列
1234567891011121314151617181920static List<List<Integer>> res;public List<List<Integer>> permute(int[] nums) { res = new ArrayList<>(); dfs(nums,new ArrayList<>(),new boolean[nums.length]); return res;}public static void dfs(int[] nums,List<Integer> ...
Springboot定时任务@Scheduled
Springboot定时任务@Scheduled
项目开发中经常需要执行一些定时任务,比如在每天凌晨,需要汇总分析处理一些数据 后存入到 MySQL 数据库中。
Java 定时任务的几种实现方式
基于 java.util.Timer 定时器,实现类似闹钟的定时任务
使用 Quartz、elastic-job、xxl-job 等开源第三方定时任务框架,适合分布式项目应用
使用 Spring 提供的一个注解: @Schedule,开发简单,使用比较方便,也是本文介绍的一种方式
创建定时任务
首先,在项目启动类上添加 @EnableScheduling 注解,开启对定时任务的支持
1234567@SpringBootApplication@EnableSchedulingpublic class ScheduledApplication { public static void main(String[] args) { SpringApplication.run(ScheduledApplication.class, args); }}
其 ...