自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(94)
  • 资源 (1)
  • 收藏
  • 关注

原创 [leetCode 25] K个一组反转链表

思路都在代码注释里,就不多说了。

2022-08-23 10:07:13 229 1

原创 [leetCode 3] 无重复最长子串(滑动窗口)

滑动窗口

2022-08-22 10:21:13 181

原创 [leetCode 640] 求解方程

但是实际处理的时候,要考虑很多情况,当前符号的正反、x没有系数的时候、最关键的是题目还要考虑x的系数可能为0,多种条件判断吧,反正做着挺恶心的。看到题目的时候第一反应是挺简单的,解析两边的字符串,然后找到x的系数和数字的大小,就找到了解。...

2022-08-10 11:30:51 162

原创 【总结】岛屿类问题(二维表格的dfs)

岛屿类问题总结

2022-08-08 16:52:09 168

原创 [leetCode 636] 函数的独占时间(栈模拟)

说人话就是,当前有一个进程在执行,如果有下一个进程要过来执行,就暂停当前这个进程的执行,最后计算每一个进程的执行时间。那就用一个栈来模拟进程的执行,如果有一个进程过来要执行,那就暂停现在正在执行的进程,计算现在正在执行的进程已经执行的时间,记录下来;如果现在进程执行结束了,那就把它从栈里面弹出来,然后计算它现在执行了多长时间,更新它自己的时间,然后把栈顶的下一个进程重新开启(也就是把执行的开始时间设置为当前的进程的结束时间+1)。依次处理所有的进程就可以了。...

2022-08-07 22:43:27 1237

原创 [leetCode 623]二叉树增加一行(每日一题)

采用层序遍历的方法,当遍历到深度为depth-1的时候,对这一层的节点进行处理,然后返回即可。层序遍历采用队列的形式,每次读一层的节点。

2022-08-05 17:27:24 113

原创 [leetCode152]乘积最大子数组

Java动归

2022-08-04 11:02:44 67

原创 [leetCode] 899. 有序队列

我们可以固定住首字母,这样除了首字母以外,后半截字符串其实就相当于情况1了,所以在这种情况下,我们能得到后半截字符串当前顺序的所有字符串,在这里面的任意一个字符串上,把首字母移到最后,相当于形成了新的后半截字符串,最终是能得到全排列的。k=1,当k为1的时候,每次移动都是把首字母移到最后,所以可以把这个字符串看成一个循环的链表,以当前这个字符串中任意一个节点为头,组成的新字符串就是我们能得到的所有的字符串了,取其中字典序较小的字符串即可。k>2 ,我们可以只移动前两个字母,就和k=2一模一样了。...

2022-08-03 21:30:33 80

原创 (每日一题)[leetCode] 622设计循环队列

head指向当前队列的头元素,tail指向下一个元素要插入的位置。用一个数组来模拟循环队列,用两个指针分别指向当前队列的头和尾。额外注意一下边界情况就可以了。

2022-08-02 20:56:59 88

原创 [leetCode 234] 回文链表

当快指针停下来的时候,慢指针一定是走到了最中间,但是这里要注意,退出的时候中间指针的方向还没有改变,因为我们后面还需要用到这个中间指针,所以在退出循环之后对中间的节点进行一下反转。然后,回文有两种情况,一种是奇数个节点,中间节点不考虑;另一种是偶数个节点,中间节点是两个,所以分别对这两种情况进行判断即可。另一种方法是先把链表转成数组,然后就可以很方便的用双指针进行判断了,不过空间复杂度变成了O(n).快慢指针+反转半截链表一起操作,可以实现O(n)的时间复杂度和O(1)的空间复杂度。...

2022-08-01 18:52:58 206

原创 [leetCode 148] 排序链表

具体处理的时候,不是一次把链表断完再归并,而是先断两节,归并一次,再断两节,再归并一次,用一个tail记录之前的链表的尾部,这样可以在归并之后把链表接上。所以其实每一次操作的时候,链表是有四节的第1节是已经归并过的链表,第2,3节是断下来的要归并的链表,第3节是还没处理的链表。先把链表断开成长度为1的小链表,然后归并一次;再断开成长度为2的,再归并;再断成4,8,16…自低向上归并,真的很不好写。cut,把链表按照长度断成一截一截的;merge,把两个链表归并。...

2022-07-31 13:24:53 90

原创 [leetCode 6134]找到离给定两个节点最近的节点

周赛的第三题,算是比较简单的mid了吧,可能别人会有更优的思路,过一段时间回来再看看。

2022-07-31 12:14:12 1302

原创 [leetCode 146] LRU缓存

然后,put方法首先需要判断这个元素的key存不存在,存在的话就移除原来的这个节点,重新加入这个节点;不存在的话,需要判断当前的size是否大于等于容量,如果是,需要更新缓存,删除链表的头结点,然后在尾部插入新节点。然后,get方法需要先判断这个元素存不存在,如果存在,还需要更新链表里面这个节点的位置,把它移到链表尾部。首先,初始化的时候应该设置好当前缓存的容量,并且初始化当前的双向链表。通过HashMap和双向链表来实现LRU缓存。...

2022-07-30 20:10:12 140

原创 [leetCode 128] 最长连续序列

只需要判断这个数的前一个数在不在集合里面就可以了,也就是看看x-1在不在,如果在,就直接跳过这个数就可以了。然后,从前往后遍历这个set,针对set里面的每个元素x,我们都判断一下x+1,x+2…所以,我们考虑优化针对数x,如果它是某个连续的子序列的起点,就往后遍历;如果它是某个子序列的中间的数,那么就不需要遍历了。然后,更新最长距离即可。这个过程的时间复杂度是O(n^2),因为我们针对每一个数,都有可能要遍历n次。首先,用一个set来存储所有的元素,这样我们可以方便的判断某个数在不在这个数组里面。...

2022-07-29 23:10:05 1487

原创 【leetCode 114】二叉树展开为链表

题目要的是一个前序遍历的顺序,那么我们就按照前序,遍历到一个节点,就把它的前一个结点的右节点指向它,这样可以吗?是不可以的,因为按照前序遍历的顺序,修改了前一个结点的右孩子之后,前一个结点原来的右孩子就丢失了。所以我们按照右左根这样的后序遍历顺序来遍历,每遍历到一个结点,就让这个结点的右孩子指向前一个结点,这样就可以了。其实很简单,只要分成两步,第一步,把当前节点的左孩子放在右孩子的位置;第二步,把右孩子放在左孩子的最右节点的右孩子上面。然后再对当前结点的右孩子重复执行上面这个步骤就可以了。...

2022-07-17 15:30:19 144

原创 [leetCode 79] 单词搜索(回溯)

递归处理当前元素上下左右四个方向的值是不是满足字符串的要求,用一个flag数组来存储已经使用过的元素,防止重复使用,然后再在递归完成后回溯撤销已经使用的节点。

2022-07-14 23:02:37 85

原创 [leetCode 48] 旋转图像

这道题和螺旋矩阵那道题基本上是一个模子,主要是判定边界真的很恶心。这里定义四个变量:loop用来控制遍历圈数,startx和starty用来控制开始的数组位置,offset用来控制一条边结束的位置,区间判定是左闭右开。循环内部用i和j来控制下标。第一次循环先记录当前边的元素,第2,3,4,5次循环分别用来给元素赋值和交换。...

2022-07-05 17:32:13 99

原创 [leetCode 34]在排序数组中查找元素的第一个和最后一个位置

两次二分查找分别找左右边界,关键是怎么找到第一个target和最后一个target,细节请看代码。

2022-07-04 21:21:05 119

原创 ★[leetCode 33] 搜索旋转排序数组

将数组一分为二,如果中间的数大于第一个数,说明左半边数组是有序的,否则说明右半边数组是有序的。对有序的那半边数组执行二分查找,对无序的半边数组递归即可。注意一下边界的判断和终止条件就好了。主要使用的还是二分查找,所以时间复杂度能达到O(logn)。这题的主要难点就是怎么想到一分为二之后,有序无序的处理。...

2022-07-01 14:39:56 128

原创 ★★[leetCode 42] 接雨水 总结

这道题有两种主要的思路,一种是按列计算接到的雨水总量,另一种是按行计算接到的雨水总量。首先来看看如何按列计算雨水总量:优化对于上述思路,时间复杂度是。我们会发现,在每次计算这一列的左右两侧最大高度的时候,出现了重复的计算,导致了时间复杂度的提升。那么有没有办法优化呢?有!我们提前把每一列左右两侧的最大高度计算出来,存下来,用的时候直接来拿就好了。计算这个最大高度的方法,可以用动态规划的思想,这样就可以把时间复杂度优化到。思路如下:其他步骤不变。按行计算雨水总量用单调栈的思想,来依次计算每一行的雨水

2022-06-28 15:50:38 126

原创 ★[leetCode 337] 打家劫舍 III

这道题打开了我树形dp的大门,没想到动态规划还能跟递归结合起来。其实本质上还是一个二维数组,不过由于递归每次可以保存一层,所以把它压缩成了一维的。用表示偷当前节点的最大金额,表示不偷当前节点的最大金额,后序遍历二叉树,返回每个节点的dp,上层再根据这个dp的金额大小进行选择。...

2022-06-17 11:32:08 54

原创 【刷题总结】背包问题

近期刷题刷到了动态规划,在背包问题这感觉有些困难,记录一下。首先是0-1背包,二维数组dp[i][j]表示选取物品为0-i,背包容量为j的背包最大能装的价值,,也就是说,可以选物品i也可以不选,取价值较大的那个,因为后面的数据依赖于前面一行的数据,所以遍历顺序是从前往后还是从后往前是无所谓的,至于是先遍历物品还是先遍历背包容量也是无所谓的,因为每个数据依赖的数据在它左上角方向,所以不管是先哪个都是可以的。其次是0-1背包的一维数组,我们发现二维数组里面每次遍历的时候用到的也只是上面一行数据,所以可以把二维

2022-06-15 11:15:09 166

原创 [leetCode 474] 一和零(二维0-1背包)

拿到题第一反应可以用回溯,暴力搜一下,果不其然,超时了动态规划0-1背包再想想,好像可以用0-1背包来解:

2022-06-14 17:14:21 92

原创 ★★[leetCode 494]目标和 (动归考虑次数和)

这题标的是中等,但是属实难到我了。也是0-1背包,但是和之前的背包问题不一样的是,之前的背包都是求容量为j的时候最大能装多少,而这个求的是容量为j的时候,装满有几种方法。递推公式为:不考虑重量为i的物品,那么装满容量为的背包就有种方法,所以考虑到物品i的时候,它有几种装满的方法呢?其实就是。那么问题来了,我们需要考虑到所有的物品,所以从前往后遍历所有的物品,针对每一个物品,如果放了物品i背包就装满,那么,依旧是从后往前遍历,防止数组被覆盖。那么为什么代码里面的是要+=累加的呢?因为dp[j]存着上一个物品i

2022-06-14 15:24:41 99

原创 ★[leetcode1049] 最后一块石头的重量(0-1背包)

首先要明确的是,什么情况下最后剩下的石头的重量一定最小?答案是,把石头尽可能均匀的分成两堆,每次从这里两堆里面拿俩来碰,那么最后剩下的就最小了,那么这道题就转换成了,把一个数据分成两个子数组,要求这两个子数组的数字之和尽量接近,可以用0-1背包来解。使用动态规划的方法,定义dp[j]含义为:容量为j的背包最大的价值,其中背包容量w和价值v都是石头的重量,那么递归公式为因为使用了一维数组,所以遍历的顺序应该是从后往前,防止前面的数被覆盖...

2022-06-13 11:05:14 221

原创 ★[leetCode 96] 不同的二叉搜索树

也是动态规划,这题也是难在没办法确定递推公式,怎么知道dp[i]和之前的关系?是这样的,我们在确定二叉搜索树的时候,不用管它每个节点是上放了什么数,只用管它的样子就行了,举个例子,假设二叉搜索树有3个节点,我们可以发现它每一个样子只会有一种树,不会有样子相同,但是节点的数不一样的二叉搜索树(指的是在题目条件下,没有重复的数)。确定了这个,我们就可以计算当前有多少种二叉搜索树了。还是以3个节点为例,可以分成3种情况:那么动态规划的递推公式也就有了。dp[i]=sum{ dp[j]*dp[i-j-1] } ,

2022-06-10 10:58:30 45

原创 ★[leetCode 343 ]整数拆分

动态规划五步:

2022-06-10 10:15:54 70

原创 ★★[leetCode 968] 监控二叉树

这道题的有几个难点:这道题好理解,但是凭空想真的很不好想。代码如下

2022-06-08 10:54:30 550

原创 ★[leetCode 738] 单调递增的数字

使用贪心的思想,从后往前遍历数字的每一位,如果遇到当前位比后面那一位更大的情况,就把当前位的数-1,然后把后面位的数全部变成9即可。Integer.parseInt()方法会自动去掉前导0,所以不用担心遇到0的情况怎么办。......

2022-06-07 21:29:57 38

原创 [leetCode 452]用最少数量的箭引爆气球

先按照气球左边界进行排序,再依次更新右边界,统计用掉的箭的数目即可。局部最优推导出全局最优

2022-06-06 15:45:49 46

原创 ★★[leetCode 406]根据身高重建队列

这题的思路是,先根据身高从大到小进行排序,再根据排序后的数组,从前往后进行插入,巧妙的地方在于,插入的位置刚好是这个人前面有多少个比它高的人,这是因为已经用身高进行了排序,所以后面的数插入的时候,不会影响前面已经插入的人。这个题的代码也比较精巧,用到了lamda表达式和compator比较器...

2022-06-06 14:53:42 38

原创 ★[leetCode 93] 复原IP地址

这道题我写了两种方法,一种是三重for循环,因为IP地址最多只有四节,那三重for循环就够用了,不像别的回溯题,有n个for循环,不得不用回溯。另外就是经典的回溯模版解法

2022-06-01 17:07:16 59

原创 ★[leetCode 51 ]N皇后问题(回溯)

N皇后问题的回溯解法,刷了这么多道回溯,现在再拿到这个题也不是很难了,主要就是处理这个位置上能不能放皇后的时候要注意一下,检查列和对角线,另外就是回溯的时候要处理已经放过的皇后,貌似这里用二维数组会方便一点,就不用像我这样删掉整个StringBuilder了。

2022-05-30 16:13:50 72

原创 [leetCode135 ]分发糖果(贪心)

这道题的贪心策略在于,不要一次考虑两边的情况,而要一次考虑一边先从左到右考虑一遍,在从右到左来一遍就可以了class Solution { public int candy(int[] ratings) { int num=0; int[] can=new int[ratings.length]; can[0]=1; for (int i=1;i<ratings.length;i++){ if (rat

2022-05-26 17:07:28 61

原创 ★[leetCode 450] 删除二叉搜索树中的节点

思路如下:先找到这个节点,然后删除它。用一个递归来实现,用返回值来实现删除策略删除它又要分情况:1. 它是叶子节点,那直接返回null就好2. 它左边是空,右边不是空,那直接返回右边节点3. 左边不是空,右边是空,返回左边节点4. 左右都不是空,那就把左边子节点转移到右子树小的节点的左子结点上,然后返回右子节点。这里右子树最小节点,其实就是右边节点的左下角那个节点。代码如下:public TreeNode deleteNode(TreeNode root, int key) {

2022-05-24 10:55:10 66

原创 [leetCode 98] 验证二叉搜索树★

我们知道二叉搜索树是有序的树,可以把二叉搜索树就当作一个数组,中序遍历二叉搜索树其实就是从小到大遍历数组,那么就可以用一个数组记录二叉搜索树里面的值,如果数组是递增的,就说明这个树就是二叉搜索树。代码如下:class Solution { public boolean isValidBST(TreeNode root) { List<Integer> res=new ArrayList<>(); traversal(root,res);

2022-05-19 15:16:36 706

原创 [leetCode106] 从中序和后序遍历构造树

原理就是,每次从后续遍历的尾部取出一个元素,以这个元素为分割点,将中序和后序序列分为两边,再分别在两边里面做递归代码容易出错,所以最好加上调试语句,方便找错public class Solution { public TreeNode buildTree(int[] inorder, int[] postorder) { TreeNode root = new TreeNode(); if (inorder.length == 0) return root;

2022-05-16 09:34:16 152

原创 [leetcode112]二叉树路径总和(递归中带着回溯)

简单的递归,通过参数回溯class Solution { boolean isSum=false; public boolean hasPathSum(TreeNode root, int targetSum) { if(root==null) return false; traversal(root,targetSum,0); return isSum; } public void traversal(TreeNode ro

2022-05-15 12:02:07 144

原创 [leetCode513] 找树左下角的值(递归、迭代两种方法)

两种方法,迭代和递归。看到这道题我的第一反应是树的层序遍历,找到最后一层的第一个节点就可以了,代码如下:class Solution {//利用队列实现层序遍历 public int findBottomLeftValue(TreeNode root) { Queue<TreeNode> queue=new LinkedList<>(); queue.add(root); while (!queue.isEmpty()){

2022-05-14 15:54:05 755

原创 [leetCode110] 平衡二叉树(递归+树高度)

回顾一下递归三部曲:确定参数和返回类型;确定结束条件;确定每一层里面的处理逻辑class Solution { public boolean isBalanced(TreeNode root) { if (height(root) != -1) return true; else return false; } public int height(TreeNode root) { if (root == null) return

2022-05-09 14:02:11 134

网络攻防复习课件

网络攻防复习课件,考前复习 网络空间安全概述 ◼ 1.2 网络安全防护 ◼ 1. 3网络攻击技术  考查重点 ◼ TCP/IP协议族的安全性 ◼ 网络安全属性 ◼ 网络攻击过程

2018-11-26

空空如也

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

TA关注的人

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