java
秦枫-_-
慵懒的程序猿
展开
-
springboot+vue项目部署到linux_arm64系统
1.前端打包,rpm run build生成dist文件夹下的文件放到后端static文件夹下(至于前后端配置可以参考我另外一篇文章)2.修改数据库链接密码(服务器短的数据库链接密码)3.将项目打包成jar文件(如果出现失败记得去改pom文件)pom文件配置 <build> <plugins> <plugin> <groupId>org.springframework.boo原创 2021-08-31 22:20:02 · 948 阅读 · 1 评论 -
run build打包之后axios能连上,websocket连不上问题已解决
网上很多人说vue.config文件下换成绝对路径,我觉得然并卵前端url配置:生产环境的url为服务端的ip后端配置:前端websocket配置:可以改成生产环境对应的api前端build之后将dist文件夹下的文件复制粘贴放入后端static文件夹下,然后后端进行封装,注意这个时候封装成的html我理解的是是静态文件,而大多数时候我们使用websocket传输数据是一种动态建立传输:我打开后可以试用axios连接后端,静态数据也可以展示但是websocket所传输的动态数据一直没有出来原创 2021-08-31 22:11:33 · 1478 阅读 · 1 评论 -
航班预订统计(差分数组)
解题思路:差分数组对应的概念是前缀和数组,对于数组 [1,2,2,4][1,2,2,4],其差分数组为 [1,1,0,2][1,1,0,2],差分数组的第 ii 个数即为原数组的第 i-1i−1 个元素和第 ii 个元素的差值,也就是说我们对差分数组求前缀和即可得到原数组。ans数组刚开始记录的是每个数和他前一个数的差值即表示为差分数组,那么我们可以举例[1,2,10],ans[0]=10,ans[1]=0,ans[2]=-10,表示的就是此时idx=1跟他前一个数idx=0相差为0,即num[0]=.原创 2021-08-31 20:39:34 · 113 阅读 · 1 评论 -
监控二叉树(基于二叉树的动态规划)(后序遍历的进阶)
解题思路:这道题目其实不是那么好理解的,题目举的示例不是很典型,会误以为摄像头必须要放在中间,其实放哪里都可以只要覆盖了就行。这道题目难在两点:需要确定遍历方式需要状态转移的方程我们之前做动态规划的时候,只要最难的地方在于确定状态转移方程,至于遍历方式无非就是在数组或者二维数组上。本题并不是动态规划,其本质是贪心,但我们要确定状态转移方式,而且要在树上进行推导,所以难度就上来了,一些同学知道这道题目难,但其实说不上难点究竟在哪。需要确定遍历方式首先先确定遍历方式,才能确定转移方程,那么该如.原创 2021-08-20 18:19:06 · 277 阅读 · 1 评论 -
最小好进制(二分查找)
class Solution { public String smallestGoodBase(String n) { long num=Long.parseLong(n); int dmax=(int)(Math.log(num)/Math.log(2))+1; for(int i=dmax;i>=2;i--){ long kmin=2,kmax=(long)Math.pow(num,1.0/(i-1))+1; while..原创 2021-08-15 22:40:41 · 111 阅读 · 1 评论 -
出界的路径数(记忆化bfs)
记忆化dfs 已遍历过的点他的方案数已知晓 所以无需重新遍历class Solution { int MOD = (int)1e9 + 7; int[][][] dp; int m1,n1,maxstep=0; public int findPaths(int m, int n, int maxMove, int startRow, int startColumn) { m1=m;n1=n;maxstep=maxMove; dp=new i.原创 2021-08-15 15:36:48 · 122 阅读 · 1 评论 -
重塑矩阵(matlab reshape函数原理)
简单来说就是同样容量的情况下才能转换,否则就输出原矩阵(i,j)对应了矩阵中第i*n+j个数,对应ans中idx/c,idx%cclass Solution { public int[][] matrixReshape(int[][] mat, int r, int c) { int m=mat.length,n=mat[0].length; if(m*n!=r*c)return mat; int [][]ans=new int[r][c]; for(int .原创 2021-08-13 12:08:30 · 1204 阅读 · 1 评论 -
跳跃游戏Ⅳ(bfs+动态规划)
解题思路:题目要求计算从第一个元素跳到最后一个元素最少的操作次数。首先容易想到的是,坐标位于最后一个元素时,结果应为0,因为不用任何操作;对于这个元素紧挨着的左右元素(此时只存在左边的元素),它的操作数是1,因为只需要跳一次就跳到了最后;同理,对于数组里值和最后一个元素相等的那些数,他们的操作数都是1。然后,对于倒数第二个元素,它的操作数前一步已经求得为1,它右边数的结果也已经知道了,是0;它左边的数如果不等于最后一个数,那么它跟最后一个数的距离应为2。这里距离的意思是指操作次数,即跳两次才能到达最后.原创 2021-08-12 18:42:14 · 220 阅读 · 1 评论 -
等差数列划分(双指针or差分)
滑动窗口优化:双指针O(N),i-idx-1之间是一个等差数列,那么求它的等差子数组即可,最小的等差子数组长度为3,数量为len-3+1,最长的等差子数组长度为len,数量为1,那么他子数组的数量也是一个等差为1的等差数列,套用等差数列求和公式,最后i不必从最开始查起,直接跳转到idx-2处 以idx-2为首查等差数列长度即可class Solution { public int numberOfArithmeticSlices(int[] nums) { if(nums.length.原创 2021-08-10 11:21:43 · 148 阅读 · 1 评论 -
超级丑数(巧用记忆数组)
本质上就是将超级丑数ans[]不断跟prime[]中元素相乘得到最新的丑数,那么会出现一个问题:1.如何保证每次放进ans的丑数都是按照次序放进去的?2.如何保证每次放进ans的丑数不是重复值?灵感来源于B站:链接: 超级丑数.解题思路:查找最小丑数可以边历数组,但是不能去重,那么我们通过观察可以考虑到prime[i]跟ans[j]乘过之后就不能回头在用prime[i]*ans[j]了,也就是prime[i]每次在使用完后只用下次乘ans[++j]了,也就是prime[i]最多跟ans[j]乘.原创 2021-08-09 23:34:32 · 129 阅读 · 1 评论 -
访问所有节点的最短路径
关键点就是二进制位来记录某一位结点是否访问 关键就是state[][]数组的设置,然后用队列维护状态class Solution { public int shortestPathLength(int[][] graph) { int n=graph.length; boolean [][]state=new boolean[n][1<<n];//表示访问到当前i结点时,总共访问了多少个结点,二进制i位为1表示i结点已经被访问了 Queue<int[.原创 2021-08-07 23:10:43 · 431 阅读 · 1 评论 -
判断环形数组是否存在循环
这道题解读:首先是 给定的数组一定有环,但是这个环不能是自环且必须是「同向」才合法,因此如果我们在遍历过程中发现存在反向,就停止检查,并且把存在反向环的节点都标记为0,如此以后在遇到这些点就可以直接跳过,因为题目给定的每个点都只有一个唯一的出路,所以不用担心会判断错误具体地,我们检查每一个节点,令快慢指针从当前点出发,快指针每次移动两步,慢指针每次移动一步,期间每移动一次,我们都需要检查当前单向边的方向是否与初始方向是否一致,如果不一致,我们即可停止遍历,因为当前路径必然不满足条件。如果在一个符合题意.原创 2021-08-07 19:08:04 · 284 阅读 · 1 评论 -
蓄水池算法(链表随机节点)
/** * Definition for singly-linked list. * public class ListNode { * int val; * ListNode next; * ListNode() {} * ListNode(int val) { this.val = val; } * ListNode(int val, ListNode next) { this.val = val; this.next = next; } * ..原创 2021-08-07 00:00:56 · 114 阅读 · 2 评论 -
有效三角形的个数(双指针或二分法)(和三数之和一模一样的思路)
力扣链接:链接: 力扣.class Solution { public int triangleNumber(int[] nums) { int ans=0; Arrays.sort(nums); for(int i=nums.length-1;i>=2;i--){ int x3=nums[i]; int j=i-1,k=0; while(k<j){ if(nums[k]+nums[j.原创 2021-08-04 22:17:59 · 130 阅读 · 1 评论 -
拓扑排序(解决具有依赖性关系的问题)
拓扑排序是对一个有向图的顶点进行排序。它关心的是图中各个顶点的连接关系,这种连接关系也叫拓扑关系,因为它不关心各个顶点的位置与距离。应用:在一个有向无回路图中,要求对所有的节点进行排序。先统计所有节点的入度,对于入度为0的节点就可以分离出来,然后把这个节点关联的节点的入度减一。一直做改操作,直到所有的节点都被分离出来。如果最后不存在入度为0的节点,那就说明有环,不存在拓扑排序,也就是很多题目的无解的情况。下面是演示过程。举例:力扣113 课程顺序解题思路:由题目给出一个有向无回路图原创 2021-08-04 18:43:37 · 1446 阅读 · 2 评论 -
最短路算法(网络延迟时间)
Dijkstra算法功能:给出加权连通图中一个顶点,称之为起点,找出起点到其它所有顶点之间的最短距离。将所有节点分成两类:已确定从起点到当前点的最短路长度的节点,以及未确定从起点到当前点的最短路长度的节点(下面简称「未确定节点」和「已确定节点」)。每次从「未确定节点」中取一个与起点距离最短的点,将它归类为「已确定节点」,并用它「更新」从起点到其他所有「未确定节点」的距离。直到所有点都被归类为「已确定节点」。用节点 AA「更新」节点 BB 的意思是,用起点到节点 AA 的最短路长度加上从节点 AA.原创 2021-08-03 22:24:24 · 380 阅读 · 1 评论 -
二叉树的垂序遍历(基于前序遍历的升华)
核心思路:自定义排序每个节点有三个属性:值val,行坐标row,列坐标col1、先按列排序,从小到大;2、列相同,再按行排序,从小到大;3、行相同,按值的大小排序,从小到大。所以我们有两种实现思路:用双哈希表或者结构体自定义排序双哈希表:一个表存储列,一个表存储行,用数组每次记录数据,然后对数组进行自定义排序/** * Definition for a binary tree node. * public class TreeNode { * int val; * .原创 2021-07-31 12:16:20 · 223 阅读 · 2 评论 -
最长递增子序列&&得到子序列的最少次数
基础:求一个序列的最长递增子序列二分+贪心:最长子序列的长度一定小于等于数组的长度,那么使用二分法,在遍历数组过程中,找到合适位置插入当前数据,如果当前查找位置比nums[i]小那么nums[i]应该放在当前位置的右侧,反之当前位置>=nums[i],那么右侧的范围应该缩小,使得当前较大位置数据替换成nums[i],如此我们可以得到最长递增子序列class Solution { public int lengthOfLIS(int[] nums) { int []mm=new原创 2021-07-26 22:38:55 · 302 阅读 · 1 评论 -
检查是否区域内所有整数都被覆盖(遍历一次,区间相消即可)
根据题意,就是要在ranges中找到能包含left和right的所有区间那依次遍历ranges所有区间,当[[start],[end]]跟[[left],[right]]没有重复区间时直接跳过当[[left],[right]]完全包含了[[start],[end]],把start,end区间消去然后判断left,start-1&&end+1,right当[[start],[end]]包含[[left],[right]]的部分区间分为两种情况:一种是包含了[[left],[right.原创 2021-07-23 16:17:22 · 228 阅读 · 1 评论 -
绝对差值和
class Solution { final int mod = 1000000007; public int minAbsoluteSumDiff(int[] nums1, int[] nums2) { int []rec=new int[nums1.length]; System.arraycopy(nums1,0,rec,0,nums1.length); Arrays.sort(rec); int maxn=0,sum=0; for.原创 2021-07-15 00:09:06 · 567 阅读 · 1 评论 -
java char[]转string 使用new String(char[])不能使用toSting()
如题原创 2021-07-13 23:44:51 · 282 阅读 · 0 评论 -
扫描线算法(天际线问题)
扫描线的核心在于 将不规则的形状按照水平或者垂直的方式,划分成若干个规则的矩形。class Solution { public List<List<Integer>> getSkyline(int[][] buildings) { List<List<Integer>> ans=new ArrayList<>(); List<int []>bu=new ArrayList<int []>();.原创 2021-07-13 23:28:08 · 334 阅读 · 1 评论 -
h指数:求数组中满足有h个数>=h,n-h个数<=h的最大h
排序遍历:结果必然是0<=h<=n其实两个条件等于一个条件,随意设一个数组,排序后,假设某一位数他是数组中第h个数,且这个h满足我们想要的结果,那么如果它和后面有h个数大于等于h,前面的数必然小于他本身,且前面有n-h个数,所以融合两个条件为一个,h从0开始递增,我们从数组最后一位最大的数向前遍历,h表示当前数(不含自身)后面有h个数>=h,如果num[i]>h,则我们发现h+1也是满足结果的,则h++替换h,同时继续向前判断,直到h不能递增为止class Solution {.原创 2021-07-11 12:07:11 · 383 阅读 · 1 评论 -
Arrays.sort在char数组自定义排序出现意外
今天在写代码时,遇到了一个意外,对char数组自定义排序过程中,报错,按照Arrays.sort()写法我应该没写错class Solution { public String frequencySort(String s) { HashMap<Character,Integer> map=new HashMap<>(); for(int i=0;i<s.length();i++){ map.put(s.charAt(i),map.getOrDef原创 2021-07-03 11:49:10 · 857 阅读 · 2 评论 -
并查集解决图论问题(连通性及有无圈存在)
题目中确定给的是连通图,那么根据图论知识树的等价条件为m=n-1,所以很明显数组中只有一条边是答案,同时只要找出来图中的一个圈就能得到答案,树是无圈连通图,那么可以用并查集思想解题回想图论找出最小生成树 有避圈法和破圈法,本题用避圈法思想遍历数组,对于每一条边的两个点 ,在这条边之前构造的图中,如果两点已连通,加上这条边就有圈,就必然不是树,所以这条边就是答案如果两点不连通,加上这条边则为树,继续下去找最大树class Solution { public int[] findRedunda.原创 2021-07-01 22:35:14 · 391 阅读 · 1 评论 -
串联字符串的最大长度(位运算)
class Solution { public int maxLength(List<String> arr) { List<Integer> res=new ArrayList<>(); res.add(0); int ans=0; for(int i=0;i<arr.size();i++){ String s=arr.get(i); int cur=0; for...原创 2021-06-19 13:29:00 · 87 阅读 · 1 评论 -
四平和定理解决一个数的完全平方数组成个数
example:求组成一个数的完全平方数的最小个数class Solution { public int numSquares(int n) { if (isPerfectSquare(n)) { return 1; } if (checkAnswer4(n)) { return 4; } for (int i = 1; i * i <= n; i++) {原创 2021-06-14 15:02:51 · 100 阅读 · 1 评论 -
前缀和大集合(子数组=target问题,子矩阵=target问题)
含有相同数量的0和1,就意味着这样的子数组长度是这个区间和的二倍,那么可以推导出这样一个公式:sum[cur]-sum[pre]=2(cur-pre) =>sum[pre]-2pre=sum[cur]-2cur; sum[i]表示前i个元素和同时cur-pre>=2;所以判断的时候从i=2开始判断, 用哈希表存放所有元素的sum[pre]-2pre和对应子数组长度,第一个应该是(0,0),后续只要判断是否存在2*sum[i]-i,如果存在就结果=当前长度-map.get(k)c.原创 2021-06-07 12:29:27 · 134 阅读 · 2 评论 -
SpringBoot项目出现Whitelabel Error Page
打开http://localhost:8080/出现这样局面 网上很多人都说controller位置不对,可是明明按照教程做的,很多人都不知道怎么回事?其实是因为网上的教学视频都比较老,现在springboot版本越来越新,老版本的已经不适用,出现这样的情况需要我们在templates里加上index.html文件重新启动项目即可成功文件内容<!DOCTYPE html><html lang="en"><head> <meta charset.原创 2021-06-07 09:15:09 · 306 阅读 · 1 评论 -
巧用图论知识解数组汉明距离总和
其实就是图论里边的偶图,例如:当只有所有数都是0或1的时候,0和1看成两个分支 0为X分支 1为Y分支 求边数,0和1连边才有汉明距离,同一分支不能互连 按位运算把所有nums[i]某一位的0和1看成两个分支 0为X分支 1为Y分支 求边数,0和1连边才有汉明距离,同一分支不能互连class Solution { public int totalHammingDistance(int[] nums) { int res=0; int []digit=new .原创 2021-05-28 09:58:39 · 114 阅读 · 1 评论 -
反转每对括号间的子串
思路:遇到括号内问题就首先想到利用栈去解决从最内层开始,一层一层反转,那么之前遍历的字符串依次存入栈中,没反转内层依次,将前一次读取的字符串添加上,反转时刻就是当遇到‘)’的时候,而放入栈中的时刻就是遇到‘(’的时候。class Solution { public String reverseParentheses(String s) { Stack<String> stk=new Stack<>(); StringBuffer res=new St.原创 2021-05-26 11:11:34 · 157 阅读 · 1 评论 -
使所有区间的异或结果为零需要修改的元素的最少数(DP)
class Solution { public int minChanges(int[] nums, int k) { int maxn=1024; int [][]dp=new int[k][maxn]; int []g=new int[k]; for(int i=0;i<k;i++){ Arrays.fill(dp[i],0x3f3f3f); //g[i]=0x3f3f3f; } for...原创 2021-05-25 13:26:45 · 122 阅读 · 1 评论 -
利用归并法求数组中的逆序对
关键在于合并的过程中怎么求解逆序对的数量,合并过程中需要将乱序的[left,mid]和[mid+1,right]元素排好序,此时[left,mid]和[mid+1,right]均排好序的情况下,那么如果num[idx1]>num[idx2]代表[idx1,mid]之间的所有元素都>num[idx2],跟num[idx2]组合都是逆序对,此时求解出来的逆序对数量是 mid-idx1+1而因为[left,mid]和[mid+1,right]还并未合并,所以前后两组元素顺序并未改变,这样算法..原创 2021-05-24 16:26:53 · 705 阅读 · 3 评论 -
区间DP问题(移除游戏+打印机问题)
class Solution { public int strangePrinter(String s) { int [][]dp=new int[s.length()][s.length()]; //for(int j=0;j<s.length();j++){ **从前往后打印** // dp[j][j]=1; // for(int i=j-1;i>=0;i--){ // if(s.charAt(i)==s.c..原创 2021-05-24 11:31:24 · 82 阅读 · 1 评论 -
与数组中元素的最大异或值(字典树)(小于等于某元素的最大异或值)
class Solution { class Tree{ Tree []son=new Tree[2]; } Tree root=new Tree(); void establish(int x){ Tree roo1=root; for(int i=30;i>=0;i--){ int t=x>>i&1; if(roo1.son[t]==null)roo1.son[t]=new.原创 2021-05-23 20:33:53 · 103 阅读 · 3 评论 -
数学博弈游戏
因为s=0,那么一开始爱丽丝就赢了 与假设矛盾了class Solution { public boolean xorGame(int[] nums) { int sum=0; for(int i=0;i<nums.length;i++){ sum^=nums[i]; } return sum==0||nums.length%2==0; }}原创 2021-05-22 10:45:25 · 339 阅读 · 2 评论 -
前K个高频单词(hashmap,priority使用以及自定义排序)
哈希表class Solution { public List<String> topKFrequent(String[] words, int k) { HashMap<String,Integer> map=new HashMap<>(); for(String ch:words){ map.put(ch,map.getOrDefault(ch,0)+1); } List<String> res.原创 2021-05-20 10:29:03 · 96 阅读 · 1 评论 -
形成两个异或相等数组的三元组数目(前缀和)
a = b 等价于 a ^ b = 0。那么我们的问题就转换为了arr[i] ^ arr[i+1] ^ … ^arr[k] == 0,可以看到与j的取值无关,只要j∈(i,k]j\in(i,k]j∈(i,k]即可满足条件。那么我们就将循环从三层循环降为两层循环,i和k,使用x计算arr[i] ^ arr[i+1] ^ … ^arr[k] 。如果 sum = 0,那么这种情况下就有 k-i个满足条件的(i,j,k)。class Solution { public int countTripl.原创 2021-05-18 12:17:39 · 75 阅读 · 1 评论 -
判断二叉树的堂兄弟节点BFS+dfs
DFSclass Solution { int x, y; int depthX, depthY; TreeNode fatherX, fatherY; public boolean isCousins(TreeNode root, int x, int y) { this.x = x; this.y = y; getNodeDepthAndHisFather(root, null, 0); return (.原创 2021-05-17 13:06:08 · 192 阅读 · 1 评论 -
数组中两个数的最大异或值(字典树||前缀树)
class Solution { class Tree{ Tree []son=new Tree[2]; } Tree root=new Tree(); void construct(int x){ Tree child=root; for(int i=30;i>=0;i--){ int t=(x>>i)&1; if(child.son[t]==...原创 2021-05-16 14:35:19 · 150 阅读 · 1 评论