自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(189)
  • 收藏
  • 关注

原创 尺取法:有效三角形的个数

尺取法:有效三角形的个数

2022-06-25 15:50:43 338 1

原创 SpringBoot实现发送邮件、发送微信公众号推送

SpringBoot实现发送邮件、发送微信公众号推送文章目录SpringBoot实现发送邮件、发送微信公众号推送SpringBoot实现发送邮件pom.xmlapplication.yml代码实现SpringBoot实现发送微信公众号推送pom.xml代码实现SpringBoot实现发送邮件  JavaMailSender是Spring封装的邮件发送封装类,支持普通文本、附件、html等格式。pom.xml <dependency> <gro

2022-03-14 16:24:53 3573

原创 SpringBoot实现用户定制的定时任务(动态定时任务)

我们知道SpringBoot能使用@Scheduled注解来进行定时任务的控制,该注解需要配合Cron表达式以及在启动类上添加@EnableScheduling注解才能使用。 不过我们现在的假定情景并不是程序员设定的定时任务,而是用户可以在我们的网页上定制定时任务,前端将该任务的信息发送到后端后,后端可以将此任务存入数据库并在规定的时间内执行。例如用户可以设定定时任务的执行时间段,执行时刻等,并可以随时新增、删除和改变定时任务。

2022-03-14 14:48:45 5986 8

原创 折半搜索(中途相遇法) + 暴力枚举:PIPI的炼金术

折半搜索(中途相遇法) + 暴力枚举:PIPI的炼金术文章目录折半搜索(中途相遇法) + 暴力枚举:PIPI的炼金术问题:思路:代码:问题:思路:  首先我们要把问题进行一个转化。根据题意,我们把若干材料炼金成功,只需这些材料字符串各个字符出现个数之和为偶数就行,而材料字符串全都是由小写字母组成,小写字母a-z可以对应数字0-25。因此我们可以考虑如下操作:我们将每个字符串中字符的出现次数是偶数还是奇数记录下来,用二维数组alphabet保存,alphabet[i][j]=0表示第i个字符串的字

2022-03-13 11:57:40 449

原创 差分数组 + 二分查找:PIPI种庄稼

差分数组 + 二分查找:PIPI种庄稼文章目录差分数组 + 二分查找:PIPI种庄稼问题:思路:代码:问题:思路:  首先我们按高度对庄稼进行排序。接下来,我们设lIndex为第一个大于前一天晚上水位b的庄稼的下标,rIndex为第一个大于当天白天水位a的庄稼的下标,那么在[lIndex,rIndex - 1]区间范围内的庄稼就被淹了一次。在这m天里,我们每天可以使用二分查找来快速求出lIndex与rIndex  如果我们用一个数组A来记录每个庄稼被淹了多少次,一开始A中所有值均为0,lInd

2022-03-11 16:12:17 1092

原创 差分数组:PIPI的区间操作Ⅰ

差分数组:PIPI的区间操作Ⅰ文章目录差分数组:PIPI的区间操作Ⅰ差分数组问题:思路:代码:差分数组  差分数组其实就是对数组做差分,即前一项减去后一项,差分数组的定义为:对于有n个元素的数组a,差分数组b为数组a中每一项与前一项的差值。显然,b[1]=a[1]-0=a[1];对于整数i∈[2,n],则有b[i]=a[i]-a[i-1]。例子如下:  我们不难发现,设sum数组为b数组的前缀和数组,那么sum数组的值和a数组的值是对应相等的,也就是说,相对于数组a的差分数组b来说,a数组就是其前

2022-03-10 11:33:40 351

原创 矩阵快速幂:PIPI的数学题IV

矩阵快速幂:PIPI的数学题IV文章目录矩阵快速幂:PIPI的数学题IV问题:思路:代码:问题:思路:  求斐波拉契数列实际上是一个DP问题,DP的状态转移方程已经给出了,问题在于用给出的状态转移方程进行线性递推,时间复杂度是O(n)的。然而本题的n达到了1e10的规模,肯定会超时,那么有什么办法能优化呢?答案是矩阵快速幂。  快速幂是什么这里就不多说了,给个传送门:数学专题:同余定理、gcd与lcm、中位数定理、筛法、快速幂等  那么什么是矩阵快速幂?矩阵快速幂其实就是将DP的状态转移方程

2022-03-10 10:33:31 233

原创 数据结构与算法:位运算专题

数据结构与算法:位运算专题文章目录数据结构与算法:位运算专题位运算基础位运算例题例题1:PIPI的位运算问题Ⅳ问题解题思路代码位运算基础  位运算指的是直接对二进制位进行的一系列操作。常用的位运算有以下几种:AND(按位与):运算符为&,作用是把两个数字对应的二进制位相与,只有对应的两个位为1,结果位才为1,否则结果位为0。比如:13&12=1101&1100=1100=12。OR(按位或):运算符为|,作用是把两个数字对应的二进制位相或,只有对应的两个位为0,结果位才为

2022-03-07 11:35:22 521

原创 HashSet源码解析(JDK1.8)

HashSet源码解析(JDK1.8)文章目录HashSet源码解析(JDK1.8)HashSet实现原理HashSet的属性HashSet的方法构造方法空参构造HashSet()HashSet(Collection<? extends E> c)HashSet(int initialCapacity, float loadFactor)HashSet(int initialCapacity)HashSet(int initialCapacity, float loadFactor, bool

2022-03-02 20:48:48 487

原创 尺取法:PIPI的目标Ⅲ

尺取法:PIPI的目标Ⅲ文章目录尺取法:PIPI的目标Ⅲ问题:思路:代码:问题:思路:  首先对数组R进行排序,如果直接枚举a,b,c的话,时间复杂度为O(n^3),肯定会超时,那么我们接下来考虑使用尺取法来解决此题。  我们只枚举a,然后令b=a+1,即b为a的下一位,c=n。枚举过程如下:  如果此时R[a]+R[b]+R[c]==0,那么满足要求,我们输出结果,然后令b++,c- -,之后继续进行和的判断。  如果此时R[a]+R[b]+R[c]<0,那么显然我们的值小了。由于

2022-03-01 12:05:18 230

原创 SpringBoot整合Shiro + JWT实现用户认证

SpringBoot整合Shiro + JWT实现用户认证  登录和用户认证是一个网站最基本的功能,在这篇博客里,将介绍如何用SpringBoot整合Shiro + JWT实现登录及用户认证  Shiro相较于Spring Security而言是一款轻量级的安全框架,使用它我们可以不在数据库中设计权限相关的表,如果我们只需要处理匿名可访问接口和登录后可访问接口,那么使用Shiro将会很方便。在之前的博客里,我介绍了Spring Security的使用,以及JWT的由来等,有需要的可以传送:【全网最细致

2022-02-28 15:59:53 3890 1

原创 【全网最细致】SpringBoot整合Spring Security + JWT实现用户认证

登录和用户认证是一个网站最基本的功能,在这篇博客里,将介绍如何用SpringBoot整合Spring Security + JWT实现登录及用户认证

2022-02-23 22:03:57 37533 70

原创 SpringBoot + Vue前后端分离开发:全局异常处理及统一结果封装

SpringBoot + Vue前后端分离开发:全局异常处理及统一结果封装文章目录SpringBoot + Vue前后端分离开发:全局异常处理及统一结果封装前后端分离开发中的异常处理统一结果封装后端全局异常捕获及处理前端axios后置拦截器前后端分离开发中的异常处理  在我们的前后端分离项目中,有时候不可避免发生后端服务报错抛出异常的情况,如果不配置全局异常处理机制,就会默认返回tomcat或者nginx的5XX页面,对普通用户来说,不太友好,用户也不懂什么情况。这时候需要我们程序员设计返回一个友好简

2022-02-21 17:36:27 4703

原创 最全面的HashMap源码解析(JDK1.8)

最全面的HashMap源码解析(JDK1.8)

2022-02-19 21:48:37 1769 1

原创 JDK中的排序:Arrays.sort的源码实现

JDK中的排序:Arrays.sort的源码实现文章目录JDK中的排序:Arrays.sort的源码实现Java中的排序并没有那么简单整体看看Arrays.sort的所有重载方法对基本数据类型数组的排序对Object数组和泛型数组的排序在使用Arrays.sort时需要注意的点Java中的排序并没有那么简单  JDK中的排序是如何实现的?用了什么算法?或许有人说用了快排,但事实上JDK中排序的实现并没有那么简单,我们进入Arrays.sort的源码来一探究竟整体看看Arrays.sort的所有重载方

2021-12-28 22:34:59 2432 1

原创 管中窥豹:由例子切入ArrayList及其Iterator的源码实现

管中窥豹:由例子切入ArrayList及其Iterator的源码实现

2021-12-17 11:07:24 859

原创 DP(三维DP数组) :买卖stock的best timing

DP(三维DP数组) + 暴力枚举:买卖stock的最佳时机文章目录DP(三维DP数组) + 暴力枚举:买卖stock的最佳时机问题思路代码问题思路  题目中首先出现了两个影响利润的因素:天数(第几天)、最多允许的交易次数,我们的DP数组需要包含这两维,但仅仅有这两维我们还是无法进行状态转移,因为我们不知道某一天到底有没有买卖股票。我们需要发现判断某一天i是否买卖股票的关键在于判断第i天与之前第i - 1天的持股状态,若第i - 1天未持股,第i天持股,则第i天买了股票,否则没买;若第i - 1

2021-12-12 17:37:40 1112

原创 博弈DP:PIPI的炸弹

博弈DP:PIPI的炸弹文章目录博弈DP:PIPI的炸弹问题思路代码问题思路  本题是一道博弈类的动态规划问题,一般而言这类问题为如下形式:博弈为两方游戏,一方按照规则先行动,行动完后把当前局面交给对方,对方再按照规则继续行动,行动完后把局面又重新交回来。以此类推,双方轮流行动,直到满足一定条件,则某方胜或者负。  这类问题关键在于先手的转换,比如对于当前先手的人来说,他进行操作后,把某个局面交给对方。那么对方就以先手的情况来面对一个新的局面。因此DP数组需要去保存某个局面下会导致当前先手胜还

2021-12-11 15:43:40 539

原创 区间DP + 暴力枚举 + 前缀和:堆石子

区间DP + 暴力枚举 + 前缀和:堆石子文章目录区间DP + 暴力枚举 + 前缀和:堆石子问题思路代码问题思路  首先要注意每次只能合并相邻的石子,没有相邻这个限制就是一个简单的Huffman树贪心问题,有相邻的条件限制就变成了一个经典的区间DP问题  我们将石子的排列看作一个区间,题目要我们求合并n个石子的最小费用,可以看成是求合并区间[1,n]内石子所需最小花费。我们可以定义状态DP[l][r]表示合并区间[l,r]上的石堆的最小花费。而DP[l][r]是如何经状态转移得到的呢?注意到我

2021-12-10 12:00:19 638

原创 DP + 记忆化搜索 + 字符串HASH:回文串询问Ⅱ

DP + 记忆化搜索 + 字符串HASH:回文串询问Ⅱ文章目录DP + 记忆化搜索 + 字符串HASH:回文串询问Ⅱ记忆化搜索问题思路代码记忆化搜索  我们知道DP状态求解的常用写法是定义一个DP数组,然后通过状态转移方程填充这个DP数组,得到所有状态。而记忆化搜索是DP状态求解的另一种写法,原理也是把计算过的状态用一个dp数组保存,下次就可以直接调用。它是一种自顶向下的写法,从最终状态出发,去计算最终状态依赖的状态,然后以同样的方式计算最终状态依赖的状态依赖的状态(这里并没有多打一遍)。实际上就是一

2021-12-09 12:05:23 512

原创 DP:地头蛇PIPI

DP:地头蛇PIPI文章目录DP:地头蛇PIPI问题思路代码问题思路  我们首先有一个自然而然的想法,我们设DP[i]为1~i这些商家能收取的最大保护费。但这样设状态我们不知道最后收取了到底是哪一家的保护费,不好进行状态的转移。因此,我们把DP[i]设为:一定收取了第i个商家保护费的情况下,1 ~ i这些商家能收取的最大保护费。收取了第i个商家的保护费,那么第i-1个商家的保护费就不能收取了,那么DP[i]看起来是从DP[i-2],DP[i-3],…,DP[1]这里面转移过来,但实际上DP[i]

2021-12-08 11:38:58 333

原创 DP:最长公共子序列Ⅰ

DP:最长公共子序列Ⅰ文章目录DP:最长公共子序列Ⅰ问题思路代码问题思路  我们先从最简单的情况入手,设两个字符串为A,B,如果只看两个串的前1个字符,那么如果A[1]等于B[1],最长公共子序列为1;如果A[1]不等于B[1],最长公共子序列为0。如果只看前2个字符,如果A[2]等于B[2],最长公共子序列长度是否等于之前只看前1个字符时的答案+1呢?一个公共子序列一定包含在从第一个字符开始的某个连续序列中,而不同连续序列以不同位置的字符结尾,如果用DP[i]表示两个串前i个字符以第i个字符结

2021-12-08 11:07:49 249

原创 DP or 贪心 + 二分答案:最长上升子序列Ⅰ

DP or 贪心 + 二分答案:最长上升子序列Ⅰ

2021-12-06 12:01:49 246 3

原创 DP + 完全背包问题:PIPI的存钱罐

DP + 完全背包问题:PIPI的存钱罐文章目录DP + 完全背包问题:PIPI的存钱罐完全背包问题问题思路代码完全背包问题  之前我们讲了01背包问题:DP + 01背包问题:饭卡。现在我们来看看完全背包问题,完全背包问题与01背包问题唯一的区别就是:01背包问题中的每个物品都只有一个,只能装一次,而完全背包问题中的每件物品都有无数个,可以装任意次。  我们还是给出完全背包问题的描述:给定 n 种物品和一个空间为 C 的背包,第i种物品的体积是vi,其价值为wi ,每种物品有无数个。应该如何选择装

2021-12-06 10:39:13 552 1

原创 DP + 01背包问题:饭卡

DP + 01背包问题:饭卡文章目录DP + 01背包问题:饭卡01背包问题问题思路代码01背包问题  01背包问题是指:给定 n 件物品和一个空间为 C 的背包,第i件物品的体积是vi,其价值为wi 。应该如何选择装入背包的物品,在不超过背包容量的前提下,使装入背包中的物品总价值最大?注意每个物品都只有一个,即每个物品都只有装与不装两种情况。  对于01背包问题,首先我们肯定可以使用DFS的方法解决,枚举每个物品装还是不装,使用一个变量ans来保存每种不超过背包体积的方法中,价值最大的那个,那么时

2021-12-04 21:00:13 535

原创 SpringBoot + Vue前后端分离开发的跨域问题

SpringBoot + Vue前后端分离开发的跨域问题文章目录SpringBoot + Vue前后端分离开发的跨域问题一个因跨域问题报错的例子跨域问题与浏览器的同源策略如何解决跨域问题后端来解决前端来解决一个因跨域问题报错的例子  我们以一个简单的springboot + vue前后端分离小例子来引入跨域问题,我们要从前端输入一个字符串,然后通过ajax发送请求将这个字符串传给后端,由后端接收并打印出来  这个例子十分简单,我们直接上代码:  后端:@RestController@Reque

2021-11-30 21:19:16 675

原创 贪心 :PIPI渡江

贪心 :PIPI渡江文章目录贪心 :PIPI渡江问题:思路:代码:问题:思路:  我们可以在读取数据时就进行处理,设用ans表示可以渡江的分身数,对于x >= d的分身,第一次跳跃就可以渡江,ans++;对于x < d && x + y >= d的分身,第一次跳跃虽不能渡江,但可以踩别人渡江,我们称这些分身为被选中的分身;对于x < d && x + y < d的分身,它们是不可能渡江的,只能当垫脚石被别人踩,将其称为垫脚石分身。 

2021-11-28 17:17:49 222

原创 反悔贪心 + 优先队列:PIPI的逃跑路线Ⅳ

反悔贪心 + 优先队列:PIPI的逃跑路线Ⅳ文章目录反悔贪心 + 优先队列:PIPI的逃跑路线Ⅳ问题:思路:代码:问题:思路:  最直接但错误的想法是:我们每回合开始时都可以尝试去进行攻击,这样能尽快杀死popo,如果接下来承受不住popo的进攻,我们或许可以放弃该回合的进攻,转为防守,即进行回血操作(设已经承受了popo造成的伤害attack,若奶量大于伤害,则回B点血,否则进行护卫,回attack点血)。但这种策略并不是贪心的策略,因为在不同的回合进行防守,赚的回血量不同,比如在popo的攻

2021-11-27 15:51:57 820

原创 贪心 + 优先队列:程序员PIPI

贪心 + 优先队列:程序员PIPI文章目录贪心 + 优先队列:程序员PIPI问题:思路:代码:问题:思路:  本题实际上是要我们在坐标轴上找到区间重叠最多的那一段有多少个区间。  我们可以将进程按开始时间从小到大排序,我们的贪心策略是让一个计算机处理尽可能多的进程,为了达到这一目的,我们要让每个计算机的空闲时间尽可能少,即完成一个进程后尽快处理下一个进程,因此我们需要知道正在处理进程的所有计算机中,最早完成任务的计算机的完成时间,即正在被处理的进程的最早结束时间。若当前需要被处理的进程的开始时

2021-11-26 11:44:51 3323

原创 贪心:最大容量和

贪心:最大容量和文章目录贪心:最大容量和问题:思路:代码:问题:思路:  首先我们需要知道,每个桶的容量就是组成它的最短木板的长度,要让总容量最大,那么我们所选取的每个桶的最短木板的长度也要尽可能大,于是我们的贪心策略为:尽可能让长木板作为最短木板  我们将木板按长度从小到大排序,用wood[]数组表示。每个木板都是需要用上的,最短的那根木板也需要用上,设其长度为wood[0],而任意桶间的容量差要大于等于L,那么我们能选择的组成桶的最短木板的最大长度为wood[0] + L。我们遍历wood

2021-11-26 10:43:10 242

原创 贪心 + 背包问题:可乐

贪心 + 背包问题:可乐文章目录贪心 + 背包问题:可乐问题:思路:代码:问题:思路:  L为我们需要购买的可乐的总体积,我们每进行一次可乐购买,所需要的可乐体积便会减少,设need为我们还需要购买的可乐体积。假设当前性价比最高(即每升单价最低)的饮料为 V 升每瓶, 价格为C。那么我们在不超过need的情况下优先买性价比最高的饮料肯定是最优选择。  故我们优先买need/V瓶该饮料,若此时need%V为0,那么我们刚好买够need升,没有浪费钱也没多买饮料;若此时need%V不等于0 , 那

2021-11-25 15:24:57 385

原创 区间贪心:最小区间覆盖问题、PIPI的高速公路

区间贪心:最小区间覆盖问题文章目录区间贪心:最小区间覆盖问题问题:思路:代码:问题:思路:  本题是区间贪心的一种:在满足覆盖[L,R]区间的情况下,最少能选择多少个区间  我们可以将线段(区间)按左端点从小到大排序,我们的贪心策略是每次所选择的区间使后面预留的空间最小,即尽可能多地占用[L,R]中的空间。为此,我们可以定义右极限rLimit,表示当前所遍历到的合法区间中r的最大值,初始化为L,每次我们从合法的备选区间(即l <= rLimit)中找出右端点r最大的区间并选择该区间,接着

2021-11-24 10:29:12 567

原创 包装类的自动装箱拆箱,==运算符及equals方法

包装类的自动装箱拆箱,==运算符及equals方法文章目录包装类的自动装箱拆箱,==运算符及equals方法一个例子程序反编译的结果及分析自动装箱看看Integer.valueOf(int i)源码自动拆箱equals方法总结:在以后写程序中需要注意的点一个例子  我们先来看这样一个简单的程序:public class SugarTest { public static void main(String[] args) { Integer a = 1; Integer b = 2; I

2021-11-23 23:07:20 840

原创 最小生成树(Prim算法、Kruskal算法):国防部长PIPI、信使PIPI

最小生成树(Prim算法、Kruskal算法):国防部长PIPI文章目录最小生成树(Prim算法、Kruskal算法):国防部长PIPI最小生成树(Prim算法、Kruskal算法)Prim算法问题1:思路:代码:最小生成树(Prim算法、Kruskal算法)  给定一个无向图,如果它的某个子图包含图中所有顶点且是为一棵树,那么这棵树就叫做生成树。如果边上有权值,那么使得边权之和最小的生成树叫做最小生成树。  求解最小生成树主要有两个算法,Kruskal算法和Prim算法。Prim算法  Pri

2021-11-18 15:50:20 430

原创 Java多线程:交替打印字符串

Java多线程:交替打印字符串文章目录Java多线程:交替打印字符串问题方法1.CyclicBarrier问题方法1.CyclicBarrier

2021-11-11 21:24:19 1111

原创 路径压缩的并查集:侦探PIPI

路径压缩的并查集:侦探PIPI文章目录路径压缩的并查集:侦探PIPI路径压缩的并查集问题:思路:代码:路径压缩的并查集  并查集是一种用来管理元素分组情况的数据结构。它可以高效的完成:  (1)查询元素a和元素b是否属于同一分组  (2)合并元素a和元素b所在的组  可以把并查集看成一个树形结构,我们把树根作为这个分组的代表。使用数组fa来保存每个节点的父节点。查询两个元素属于同一组时,我们需要沿着树往上走找到树根,两个元素有同一个树根说明属于同一组。合并时只需要把一个树根挂到另一个树根上即可。

2021-11-11 11:58:01 463

原创 单源最短路(优先队列优化的dijkstra算法):PIPI的逃跑路线Ⅲ

单源最短路(优先队列优化的dijkstra算法):PIPI的逃跑路线Ⅲ文章目录单源最短路(优先队列优化的dijkstra算法):PIPI的逃跑路线Ⅲ问题:思路:代码:问题:思路:  本题为单源最短路问题,麻烦点在于边权会不断变化,乍一看好似非常难,我们不可能每次去更新变化后的边权,仔细观察发现边权的变化函数f(x) = 1 / (1 - x)有点特殊,是有意设计成这样的,那么一定蕴含某个规律。设某条边的权值为x,经过一条道路后,权值变为1 / (1 - x),那么再经过一条道路后呢?权值将变为f

2021-11-10 11:31:33 497

原创 单源最短路(优先队列优化的dijkstra算法):PIPI的飞行路线

单源最短路(优先队列优化的dijkstra算法):PIPI的飞行路线文章目录单源最短路(优先队列优化的dijkstra算法):PIPI的飞行路线dijkstra算法问题:思路:代码:dijkstra算法  dijkstra算法用于解决不含负权边单源最短路径问题。首先要知道两个点之间的最短路径有以下两种情况:  (1)连接两点的边本身就是最短的。  (2)两点之间通过一些中间节点相连得到最短距离。  dijkstra算法用dis数组保存当前源点s距离其他点的最短距离。初始时,dis数组除了源点di

2021-11-08 20:50:11 473

原创 Java多线程:交替打印FooBar

Java多线程:交替打印FooBar文章目录Java多线程:交替打印FooBar

2021-11-04 21:36:58 310

原创 二分图染色:二步侠PIPI

二分图染色:二步侠PIPI文章目录二分图染色:二步侠PIPI二分图问题:思路:代码:二分图  二分图/二部图的定义:设G=(V,E)是一个无向图,如果顶点V可分割为两个互不相交的子集(A,B),并且图中的每条边(u,v)所关联的两个顶点u和v分别属于这两个不同的顶点集(u in A,v in B),则称图G为一个二分图/二部图。简而言之,有两顶点集且图中每条边的两个顶点分别位于两顶点集中,每个顶点集中没有边直接相连,这样的图为二分图。  通过以上定义,我们可以总结出二分图的判定有以下两点:  1、

2021-11-04 19:46:35 139

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除