自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 centos7.6include没有mysql.h

mysql.h

2022-06-26 21:24:33 610 1

原创 Datagrip连接虚拟机数据库报错:[08S01] Communications link failure

问题描述:使用Datagrip连虚拟机上的数据库报错:[08S01] Communications link failure解决方法:修改Advanced中的useSSL,改为false。

2022-05-21 10:05:39 1316

原创 mybatis报错:Invalid bound statement (not found)

1.问题描述:项目中mybatis一直报错绑定错误,出现这种情况一般都是mapper.xml文件写错了,命名空间不对等问题。2.问题原因:经排查,是mybatis配置文件错误导致的。刚开始是将mapper.xml文件和mapper文件放一起的,配置文件写的是mapper-locations: classpath:com/xing/mapper/xml/*.xml。后来将xml文件移到了resource目录下,忘记修改配置文件。3.解决方法:要么将没扫描到的xml文件移到resource目录下的map

2022-05-19 10:11:02 3042

原创 springboot报错:class path resource cannot be opened because it does not exits

问题描述:springboot报错:在使用@PropertySource注解读取properties文件时,报错:class path resource cannot be opened because it does not exits。问题原因:发现prpperties不是绿色的小叶子。解决方法:1. 先将resources目录标记为resources目录。2.然后添加properties文件。...

2022-04-27 20:16:55 9749 2

原创 优先队列总结

优先队列在插入元素的时候,自动将其插入到合适的位置,实现动态的调整,底层是堆。创建优先队列时,可自己实现comparator接口的compare方法,用于队列中的元素排列规则。在使用优先队列时,有时候需要配合排序数组使用,也可以为Arrasy.sort()方法传入一个comparator接口的匿名内部类或lamda表达式,自定义数组排序规则。力扣630. 课程表 III思路:贪心+优先队列。每次选择一个截至时间最早的课程,判断该课程的持续时间与之前课程的持续时间之和是否超过了该课程的截至时间,如果没超过

2022-04-08 11:23:01 301

原创 java char与int互转

1.char转int,直接减去’0’2.int 转char,加上+'0’再强转为charint a = (char)(c + '0')

2022-03-08 16:47:35 367

原创 关于二分查找

1.while(left < right)和while(left <= right)的区别:<的终止条件是[right, right],<=的终止条件是[right+1, right+1].2.当mid = left + (right - left ) / 2时候,如果mid不满足target的条件,left和right要加1:left+1, right+1。如果使用二分查找寻找边界时,left不加1,right加1,应该mid=left + (right - left + 1)

2022-03-05 20:35:09 307

原创 剑指 Offer 56 - I. 数组中数字出现的次数

思路:题目规定时间复杂度为0(n),所以不能使用哈希表,暴力方法。利用异或,二进制位相同位0,不同为1.如果只有一个数字出现一次,则只需要将所有 数字进行异或运算,最后的结果即为该数字,因为出现两次的数字因异或运算两两抵消了。因此,需要将原数字进行分成2组,这两个数字各在一组,相同的数字在一组。具体实现为:先将所有数字进行异或得到res,按res的二进制位为1进行分组,数字的该二进制位为1,在一组,为0在另一组。然后在组内各进行一次异或,即得到结果。代码:class Solution { pub

2022-03-04 11:18:16 95

原创 剑指 Offer 48. 最长不含重复字符的子字符串

1.思路:使用动态规划+哈希表。设s[j]为字符串下标j的元素,s[i]为s[j]左边最近的,与s[j]相同的元素,d[j - 1]表示以s[j - 1]结尾的不含重复子串的最大长度。此时分三种情况:1)d[j - 1] > j - i,此时i位于d[j - 1]区间内b c d a e f g a, s[j] = a, s[j - 1] = g2)d[j - 1] = j - i,此时i位于d[j - 1]区间内,是d[j - 1]区间的最左元素。b a d g e f b a, s[j]

2022-03-04 10:31:20 268

原创 剑指 Offer 47. 礼物的最大价值

思路:使用动态规划,dp[i][j]表示从起点到{i, j}的累计最大礼物价值。所以可以写出状态转移方程:p[i][j] = max(dp[i - 1][j], dp[i][j - 1]) + grid[i][j];代码:class Solution { public int maxValue(int[][] grid) { int rows = grid.length; int cols = grid[0].length; int[][] dp

2022-03-02 20:53:21 57

原创 剑指 Offer 46. 把数字翻译成字符串

方法1.动态规划思路: //类似青蛙跳台阶的思想,要求前i位的翻译数,第i位可以单独作为一位,此时,前i位的翻译数与前i-1位数的翻译数一致,第i位也可与i-1位组成一个2位数进行翻译,如果可以组合,则前i位的翻译数与前i-2位的翻译数一样,因为后面两位固定只有一种翻译方式如果不可以组合,则这种方式为0种。代码:// class Solution {// public int translateNum(int num) {// String s = String.value

2022-03-02 19:36:02 73

原创 HTTP 长连接短连接使用场景是什么

HTTP1.1之前默认使用的是非持久连接,HTTP1.1之后使用的是默认使用持久连接。只要客户端和服务器都设置Connection为keep-alive,就是使用长连接。实际上,是使用TCP长连接,因为http是应用层协议,要tcp是传输层协议,肯定是再客户端和服务器通过三次握手建立tcp连接,才能传输信息。为什么博客园这种用户少的网页也使用长连接,使用长连接不是为了减少频繁的tcp开销吗?事实上,使用长连接的一个好处是可以复用tcp连接,即便是访问客户端较少的博客园,诸如js等文件也需要建立tcp连接,

2022-03-01 22:00:19 1171

原创 剑指 Offer 42. 连续子数组的最大和

1.思路: 使用动态规划,dp[i]表示nums[i]结尾的最大连续数组和,也就是前i个元素的最大连续和是取前i个加上当前元素呢还是,抛弃前i - 1个,从当前元素开始。需要维护一个额外的MaxSum保存中的的子数组的最大和dp[num.length - 1]不是最大和,他代表的仅仅的(dp[nums.length - 2] + nums[length - 1], nums[nums.length - 1])两者的最大值2.代码:class Solution { public int maxSu

2022-03-01 19:34:13 577

原创 剑指 Offer 39. 数组中出现次数超过一半的数字

方法1:排序思路:先排序,然后返回arr[arr.length / 2]代码:排序class Solution { public int majorityElement(int[] nums) { quickSort(nums, 0, nums.length - 1); return(nums[nums.length / 2]); } public static void quickSort(int[] arr, int start, int

2022-03-01 17:12:48 145

原创 剑指 Offer 31. 栈的压入、弹出序列

1.思路:使用一个辅助辅助栈,对于pushed中的元素,每次将一个元素入栈,然后栈顶元素和出栈顺序的元素相比,如果相同,则将元素出栈,也就是用在辅助栈上模拟入栈和出栈顺序,最后栈为空,则说明出栈顺序是可行的,否则不行。2代码:class Solution { public boolean validateStackSequences(int[] pushed, int[] popped) { Stack<Integer> Stack = new Stack();

2022-03-01 14:50:51 78

原创 算法中常见各种判断条件

1.数组:matrix == null || matrix.length == 0 || matrix[0].length == 0;2.栈:while(!stack.isEmpty())3.队列:队列为空:rear == front, 队满:(rear + 1) % queaSize = front;4.双指针: while(l < r)

2022-03-01 14:28:02 180

原创 剑指 Offer 30. 包含min函数的栈

1.思路:设置两个栈A和B,A存储所有元素,B存储的是小于等于A入栈的第一个元素,且按非递增顺序排列,这就保证了B的栈顶元素是最小元素2.代码:class MinStack { Stack<Integer>A; Stack<Integer>B; /** initialize your data structure here. */ public MinStack() { A = new Stack(); B =

2022-03-01 11:39:37 52

原创 剑指 Offer 29. 顺时针打印矩阵

1.思路:模拟顺时针打印的过程,从{0, 0}开始。遍历矩阵,最开始是向右,当row或者col超过下标或者元素已经被访问,则改变访问的方向。2.代码:class Solution { public int[] spiralOrder(int[][] matrix) { if(matrix == null || matrix.length == 0 || matrix[0].length == 0)return new int[0]; //模拟顺时针打印矩阵

2022-03-01 10:27:59 50

原创 剑指 Offer 49. 丑数

1.思路://用dp[i]标识第i个丑数,根据丑数的定义,若当前已得到dp[i - 1],则dp[i]只能等于dp[a] * 2, dp[b] * 3, dp[c] * 5中的最小者,a, b,c未知//其中dp[a]是首个乘以2大于dp[i-1],dp[b]是首个乘以3大于dp[i-1],dp[c]是首个乘以5大于dp[i-1]的丑数2.代码:class Solution { public int nthUglyNumber(int n) {//用dp[i]标识第i个丑数,根据丑数的定义

2022-02-25 16:04:04 130

原创 【无标题】

1.思路:使用快速幂,将x的a次方的值数a转换为2进制的形式,即x ^ a = x^ (1 * b1) * x^ (2 * b2) * x^ (4 * b3) * …,bi为0或者12.代码:class Solution { public double myPow(double x, int n) { if(n == 0) return 1; double res = 1.0; //当n为负数时,例如2的-3,做法是将2变为小数,-3变为正3,由于

2022-02-22 17:05:48 63

原创 剑指 Offer 15- 二进制中1的个数

1.思路:方法1是利用求整数的二进制的方法,每次加上n %2,再将n / 2。直到n == 0;疑惑的地方在于java通不过部分测试案例,c++则可以。方法2是利用与运算逐个比较n的每个二进制位,为1则count++;2.代码://编译不通过,c++可以// public class Solution {// // you need to treat n as an unsigned value// public int hammingWeight(int n) {//

2022-02-22 15:14:33 373

原创 剑指Offer14-II-剪绳子

1.思路:本题是在I的基础上做了限定,要求结果求余,所以不能再用动态规划。根据数学证明,绳子剪成多短,每段为3时乘积最大。设n 为绳子长度,n = x * a + b,即将绳子剪为a段,每段x长,余b。b可取0, 1, 2。需要注意的是,b为1时,可以和一个3凑成2 和2,这样乘机会更大。2.代码:class Solution { public int cuttingRope(int n) { if(n < 4) return n - 1; long res

2022-02-22 14:10:14 43

原创 剑指Offer14-剪绳子

1.思路:使用动态规划,dp[i]表示长度为i的绳子可以剪的最长长度,动态转移方程为dp[i] = max(dp[i], max(j * i, j * dp[i - j]))。2.代码:class Solution { public int cuttingRope(int n) { //dp[i]表示长度为i剪成m段的最长长度 int[] dp = new int[n + 1]; //长度为2剪成2段 dp[2] = 1;

2022-02-22 12:48:53 352

原创 剑指offer13-机器人的运动范围

1.思路:使用广度优先遍历,使用队列存储元素,将当前元素出队,依次访问该元素的周边元素,如果符合条件则记作以访问,并将其入队,总数加1,从而实现广度优先。当队列为空时,则结束访问,返回总数。2.代码:class Solution { public int movingCount(int m, int n, int k) { if(k == 0)return 1; //标记当前格子是否访问过,访问过为1 int[][] vis = new int[m]

2022-02-21 18:07:31 151

原创 冒泡排序,选择排序,堆排序,快速排序学习心得

常用排序算法中复杂度为o(n2),o(n log(n)),冒泡和选择为o(n2),堆排序和快速排序为o(n log(n))。1.冒泡排序主要思路:每一趟从第一个数开始,两两比较,如果nums[i] > nums[i + 1],则将两数交换,共比较nums.length - 1趟数。改进版是某一趟没有发生交换,则停止。代码易错点。 boolean swaped = true; for(int i = 0; i < nums.length - 1; i++){ //如果

2022-02-18 18:55:28 509

原创 LeetCode430-扁平化多级双向链表

思路:用dfs实现扁平化当前节点的child,并返回扁平化的最后一个节点childLast。如果next不为空,则将next链接在childLast后面。代码:class Solution { public Node flatten(Node head) { dfs(head); return head; } //dfs用于扁平化当前节点作为head的链表,并返回扁平化后的最后一个节点 public Node dfs(Node head)

2021-12-13 15:03:43 451

原创 LeetCode328-奇偶链表

思路:思路很简单,将原链表中的奇节点两两连起来,偶数节点两两连起来,再将偶数链表链在奇数链表后边。代码://思路就是拿掉原链表中的偶数节点,链起来,然后将偶数节点的头连在最后一个奇数节点后面。class Solution { public ListNode oddEvenList(ListNode head) { if(head == null) return null; //分别指向奇数节点,偶数节点,偶数节点头 ListNode odd =

2021-12-07 20:01:49 613

原创 LeetCode

思路:思路很简单。cur指向前一个节点,cur指向当前节点,利用pre删除当前与val相同值的节点。代码:class Solution { public ListNode removeElements(ListNode head, int val) { ListNode dummyNode = new ListNode(0, head); ListNode pre = dummyNode, cur = pre.next; while (cur !=

2021-12-07 14:53:18 2832

原创 LeetCode92-反转链表Ⅱ

思路:思路简单,截断中间链表,反转再拼接。代码:class Solution { public ListNode reverseBetween(ListNode head, int left, int right) { //思路很简单,反转中间部分,再拼接起来。 //为了省去奇奇怪怪的错误,创建一个头节点,避免节点个数太少导致null.next.next ListNode dummyNode = new ListNode(0, head);

2021-12-06 20:56:21 376

原创 LeetCode1816-截断句子

方法1:1.思路:最开始想到的是对字符串分割,创建一个空串,将前k个单词拼接起来。2.代码:class Solution { public String truncateSentence(String s, int k) { String[] str = s.split(" "); String res = ""; for (int i = 0; i < k; i++){ if(i == k- 1){

2021-12-06 14:56:13 65

原创 LeetCode1446-连续字符

1.思路:题目要求字符串中字母连续出现的最大次数,只需要维护一个ans和一个计数器,如果i和i+1的元素相等,次数加一,并根据条件判断是否更新ans,不相等则将count置为1,重新开始。2.代码:class Solution { public int maxPower(String s) { int count = 1, ans = 1; for (int i = 0; i < s.length() - 1; i++){ if(s.

2021-12-01 20:57:01 3544

原创 LeetCode刷题心得

1.溢出问题。LeetCode69 , int mid = l + (r - l + 1) / 2;会溢出,最后的测试用例2147483647, mid+1就超出了int的数据为范围: -2147483648 ~ +2147483647。解决方法:1)c++: int mid = (long long) l + r + 1 >> 2;

2021-12-01 20:18:08 4060

原创 LeetCode160-相交链表

1.思路:开始想的是分别用两个hashSet保存两个两个链表的元素,最后返回元素的交集即可。很明显这是错误的想法,题目要求是返回相交的节点。所以,正确的做法是保存一个链表的节点,遍历另外一个链表,遇到元素相同的节点停止,返回该节点即可。2.代码:3.复杂度分析:l42时间复杂度为o(n) + o(n) = o(n),160时间复杂度为o(m+n) 。why?142时间主要消耗在了寻找相遇点和入环点,寻找走的距离没有超过链表长度,所以是0(n)。而相交链表是实打实的要走完链表,所以是0(m+n)。..

2021-12-01 18:43:25 196

原创 LeetCode142-环形链表II

1.思路:假设环为顺时针,紫色为相遇点,相遇时fast已经走了n圈,fast速度为slow两倍,则fast走的总距离为:a + b + n(b + c) 由于假设fast速度为slow两倍,则fast走的距离为slow两倍。则有:a + b + n(b + c) = 2(a + b) => (n-1)(b + c) + c = a,也就是说当两个速度相等两个指针p1 p2,p1从起点出发,p2从紫色点出发,一直走,p2走了n-1圈回到了紫色点,再走c的距离到入环点,p1走过距离a也到了入环点,p1和

2021-12-01 11:06:38 166

原创 LeetCode141-环形链表

1.思路:使用双指针,如果有环,则fast和slow会在里面打转,并最终相遇,如果没有环,则fast最后会指向null。如果fast还没遇到slow时就一直走,如果fast走到头就返回false,否则直到相遇返回true.错误代码思路是:fast没到头就一直走,有环fast和slow会在环里打转,最终相遇,返回,否则到头结束循环。不知道为啥报空指针异常,焯!2.代码:错误代码:public class Solution { public boolean hasCycle(ListNode he

2021-11-30 17:40:24 314

原创 LeetCode561-数组拆分I

1.思路:2n个元素,两两配对,要每组中的最小者累加和最小,那肯定不能让前n个最小的元素分散再每个组,不然每个组中的最小的值就是前n个最小元素之和了,不满足题意,所以应该尽量避免这种情况,怎样才能避免小元素落在了不同组呢,对于排序后的数组,只要将0号元素和1号元素放在一个组,那必然有一个组不包含前n个小元素,这样加起来肯定就大一些,同样的,将3和4号元素再放在一个组,又会出现一个组不包含小元素(排序后的前n个元素),sum又变大了,只要将前面的小元素全部以序放在一起,保证sum就是最小的。至于为啥要排序后依

2021-11-22 16:51:15 380

原创 LeetCode151-翻转字符串里的单词

方法11.思路:2.代码:class Solution { public String reverseWords(String s) { //去两头空格 s = s.trim(); //使用空格分割 String[] str = s.split(" "); String res = ""; for(int i = str.length - 1; i >= 0; i--){

2021-11-22 10:33:10 1454

原创 LeetCode14-最长公共前缀

1.思路:将所有单词与第1个单词依次比较第k个字母,出现某个单词的长度等于i(该单词下标最多为i-1)或者该单词的字母与第一个单词的第i个字母不相等,则返回首字母的前i-1个字母。2.代码:class Solution { public String longestCommonPrefix(String[] strs) { if(strs == null || strs.length == 0){ return ""; }

2021-11-17 19:11:45 80

原创 LeetCode498-对角线遍历。

1.思路。开始想到了将所有对角线按一个方向访问,偶数条翻转。搞错的是list存储中间结果,开始想的是list存数组,但是如何将list后续存入res没想明白,其次是每条对角线的起点没想对。总结起来就是刷题还不够熟练,list用的不熟。求解思路就是将每一条从右上角起到左下角的对角线元素放入res,这样的对角线共行数+列数-1条。2.代码。class Solution { public int[] findDiagonalOrder(int[][] matrix) { if(matr

2021-11-15 20:48:30 233

原创 LeetCode-旋转矩阵

方法11.思路:创建新数组copy,将第一行的元素复制到copy最后一列,将第二行的元素复制到copy最后第二列,依次直到最后一行。2.代码:class Solution { public void rotate(int[][] matrix) { int size = matrix.length-1; int[][] copy = new int[size][size]; //将第一行与倒数第一列交换 for (int i =

2021-11-11 11:11:21 577

空空如也

空空如也

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

TA关注的人

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