自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

Max的博客

一个想起来就写点的小白同学

  • 博客(157)
  • 资源 (4)
  • 收藏
  • 关注

原创 置顶

你永远不知道别人比你有多努力,比你有多强

2019-04-08 14:56:23 170

原创 LC39.组合总和

力扣题库第39题,组合总和

2022-08-27 20:37:06 239 1

原创 LC100-11. 盛最多水的容器

题目题目要求 暴力(超时)class Solution { public int maxArea(int[] height) { // 可以正常运行,但是提交会产生超时的 int max = 0; int start = 0; int end = height.length; for(int i = 0; i < height.length; i ++) { for (int j

2022-03-21 22:44:20 293

原创 LC105.从前序遍历与中序遍历中构造二叉树

题目查看题目解题思路主要思路:递归思想。主要考虑的问题:根据前序和中序遍历恢复二叉树的基本思想每次怎样划分preorder数组进行遍历主要步骤以及细节:前序遍历数组中,从头开始,每一个都是节点,可以用来区分左右子树。找到前序遍历数组中的第一个元素,通过该值定位到中序遍历中与该点值相同位置的索引(无论是哪一种遍历,数组中的元素都是一样的,显然的)记录索引为idx,此时idx在中序遍历数组中已经将数组分成两半。使用递归,在下一次的递归中:左子树,对于preorder数组来说,从上一次

2022-01-09 14:42:56 718

原创 LC997.找到小镇的法官(每日一题)

题目查看题目解题思路题目分析:小镇的法官不相信任何一个人;说明法官永远不会出现在左边,出现在左边一定不可能是法官每个人(除了小镇法官外)都信任小镇的法官;说明法官不仅要出现在右侧并且出现的次数还要等于n - 1。法官要同时满足上面两个条件思考:开始考虑直接对数组进行操作,通过对右侧“疑似法官”的数量进行统计,但是发现这样存在两个问题:不方便判断“疑似法官”是否在居民中出现过。不方便统计每个“疑似法官”出现的次数。综上思考,考虑使用哈希表,居民编号作为key,出现的次数作为value,

2021-12-19 01:37:37 149

原创 LC419. 甲板上的战舰

题目查看题目解题思路分析题目:战舰只能水平或者垂直放置在甲板上,说明不需要考虑对角线的问题,X的分布只会是竖着或者横着两艘战舰之间至少有一个水平或者垂直的空位分隔,说明不会出现“「”和“#”类型的战舰摆放位置,进一步解释为,如果横着没有找到战舰,那么一定就是竖着或者是战舰就占一个位置。由此的主要思路:遍历每一个位置遇到‘X’的时候先判断其水平方向(因为从凑遍历,所以遇到的所有‘X’均可以认为是战舰首部),如果不是‘X’意味着战舰的摆放位置不是水平,不再进行该方向的判断。转到垂直方向进行相同

2021-12-18 14:10:26 331

原创 LC136.只出现一次的数字

题目查看题目解题思路不得不佩服大佬的思路,此次可以偷鸡的地方在除了某个元素只出现一次以外,其余每个元素均出现两次,并且要求最好的时间复杂度是线性复杂度。大佬说过:遇到对数字的操作且要求线性时间复杂度的,首要考虑的是运算问题。综上,此题的最好的解法就是使用异或运算(^),异或运算(0 ^ 0 = 0)(1 ^ 1 = 0)(1 ^ 0 = 1)(0 ^ 1 = 1)结合题目的特殊条件,当某一个数存在两个的时候,经过异或运算会变为0不影响最后的结果,所以从头遍历的所有的数字,返回所有数字经过异或运算

2021-12-17 22:07:02 97

原创 Linux中关于mount的知识

linux中关于mount的相关知识

2021-12-17 21:55:45 540

原创 LC257.二叉树的所有路径(迭代法)

题目查看题目解题思路迭代法实现所有路径的,迭代法采用BFS的方式,使用的数据结构:String类型的数组列表,用来存储最后的结果。Object(可以改变的存储的数据的数据类型)类型的stack栈主要思路:判断根结点是否为null,如果为null,直接返回res数组(此时列表为空)当根结点不为null,将根节点的节点和节点值全部推入栈当栈中不为空时,首先弹出栈尾元素的节点和到达该节点的路径信息。判断是否到达叶子节点,如果到达叶子节点,则将该点作为路径的终点(不加“->”)加入到路径

2021-12-17 10:14:16 138

原创 【无标题】LC257.二叉树的所有路径

题目查看题目解题思路使用回溯的思想,核心在保存上一个值的路径,采用递归的方式实现DFS,完成对整个路径的遍历。使用的数据结构:一个String类型的ArrayList用来接收最后的结果,一个Integer类型的ArraList用来接收每一轮遍历到的节点的数值主要思路:当节点为null直接返回定义的res(此时为null)当根节点不为null,进入递归中,递归的主要思想:base case :如果节点的左右子树均为null,此时代表已经走到了叶子节点,此时可以将之前存储的走过的每个节点的

2021-12-16 21:07:16 752

原创 LC111.二叉树的最小深度

题目查看题目解题思路利用的还是层序遍历的思路,只不过在在这里不需要对节点的值进行操作了,将节点的左右子树推入队列之后直接推出即可。但还是要注意一点计算树高度的heigh的自增运算要在每一层遍历之前,不能放到每一层遍历的循环中去,这样会糟成错误。代码/** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * TreeNode rig

2021-12-12 12:53:06 77

原创 LC116.填充每个节点的下一个右侧节点指针(迭代法)

题目查看题目解题思路模板题,层序遍历,因为题目给出是完全二叉树,所以不需要考虑在中间位置节点的next指针指向null。注意点:每一层的最后一个节点的next指向null即可。中间节点的next指向自己的右节点,注意连接时用peekpeekFirst()而不要pollFirst()。代码/*// Definition for a Node.class Node { public int val; public Node left; public Node rig

2021-12-12 12:00:50 333

原创 LC429.N叉树的层序遍历

题目查看题目解题思路(模板题)N叉树的层序遍历与二叉树的层序遍历在本质上没有任何区别。不同的是子树的表示方式,而叉树的子树只有左子树和右子树,N叉树的表示方式是一个节点形式的链表,因此,在普通二叉树将左右子树推入队列的部分修改成将节点链表推入队列中即可,获取节点的值使用get()函数(因为底层是数组也就是ArrayList,所以可以直接通过索引快速找到对应的值),后面的操作与普通的二叉树遍历没有任何区别。代码/*// Definition for a Node.class Node {

2021-12-12 00:05:45 280

原创 LC637.二叉树的层平均值

题目查看题目解题思路主要思路:层序遍历Double和int之间的转换关系由于使用的是while循环,会对levelsize进行操作,所以最后求平均数的时候,不要再使用levelsize,否则会出现“除0”的错误。代码/** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * T

2021-12-11 22:29:36 313

原创 LC199.二叉树的右视图

题目查看题目解题思路主要思路:层序遍历只将最后一个元素放入list中去(通过size()进行控制,当遍历到最后一个的时候将val进行存储),其他将自己的左右子树推入队列之后直接弹出。代码/** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * TreeNode() {} *

2021-12-11 21:01:49 213

原创 【无标题】

题目查看题目解题思路将正常的层序遍历的结果进行反转即可,细节见注释。代码/** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * TreeNode() {} * TreeNode(int val) { this.val = val; } * TreeNode(int

2021-12-11 17:27:11 166

原创 LC239.滑动窗口的最大值

题目(Hard)查看题目解题思路此题的考察主要有两方面:队列,双向链表模拟双向队列的使用队列中何时存放元素以及该存放什么样的元素主要思路:**在上述滑动窗口形成及移动的过程中,我们注意到元素是从窗口的右侧进入的,然后由于窗口大小是固定的,因此多余的元素是从窗口左侧移除的。 一端进入,另一端移除,这不就是队列的性质吗?**所以,该题目可以借助队列来求解。题目要求是返回每个窗口中的最大值。那么这个如何解决呢?我们以数组{5, 3, 4, 1},窗口大小k=3来进行说明。这里我们规定窗口右侧边

2021-12-07 22:30:26 403

原创 LC150.逆波兰表达式

题目查看题目解题思路本题通过一个栈就可以解决计算问题,找到规律之后还是比较简单的。主要思路如下:定义一个栈用来接收计算数,因为题目已经说明不会出现计算错误情况,所以不用担心报空栈的错误。当读取到数字的时候,将数字压入栈中。如果读取到一个运算符,将栈中的前两个元素推出栈,根据运算符进行计算,注意,操作顺序是,后弹出的数字操作(±*/)先弹出的数字。将计算的后的数字再压入栈中。重复上面的操作,知道tokens数组全部遍历完毕。最后返回栈中唯一的元素,直接pop()即可。代码class

2021-12-06 22:56:33 65

原创 LC1005.K次取反后最大化的数组和

题目查看题目解题思路主要思路:首先将数组进行排序,从小到大排序。分情况讨论。首先再k值大小的范围内将所有的负数进行翻转,按照绝对值大小的顺序(排序的时候,绝对值大的负数已经排在了前面,所以按照默认情况反转就好),如果k值在这个过程中耗尽,那么直接返回加和之后的结果。如果k在反转完所有的负数后还有剩余,再进行判断:k = 偶数,不影响结果,直接返回加和结果即可。k = 奇数,相当于偶数 + 1,先将当前数组再进行一次排序,选择第一个元素进行反转(可能是0,有可能是正数,不过此时的正数一定

2021-12-03 18:30:28 99

原创 LC18.四数之和

题目查看题目解题思路可以简单的理解为在三数之和的基础上再加一层循环(for循环固定一个值,右侧再进行三数之和的求解),核心还是三数之和。四数之和,和15.三数之和 (opens new window)是一个思路,都是使用双指针法, 基本解法就是在15.三数之和 (opens new window)的基础上再套一层for循环。 但是有一些细节需要注意,例如: 不要判断nums[k] > target 就返回了,三数之和 可以通过 nums[i] > 0 就返回了,因为 0 已经是确定的数

2021-12-03 17:33:39 85

原创 LC506.相对名次

题目查看题目解题思路注意问题:给定的sorce数组不是排好序的,不能直接根据数组顺序进行名次的分配。前三名又额外的荣誉称号,要单独列出来。主要思路:设置一个Map,使用Map将数组中的数据存储起来,将成绩作为Key,将索引作为Value进行存储。因为Arrays中的sort函数只能从小到大排序,所以稍微改了一下冒泡,使数组从大到小排列。遍历数组,使用switch进行前三名荣誉的判别。遍历的时候将排序后数组的值作为Map的get()的参数找到该成绩在原数组的位置。创建一个String类型

2021-12-02 22:34:52 398

原创 LC1446.连续字符

题目查看题目解题思路主要思路:双指针,左指针left,右指针right。两个指针从同一个地方出发。当两个指针所指向位置的元素相同时,right向前移动,计数器num加1。当两个指针所指向位置的元素不同时,left移动到right位置,计数器与max比较,取最大值存入max。最后返回max。注意点:要考虑越界问题,左指针到达倒数第二个元素就要停止。考虑字符串中的元素全部相同的情况。在返回语句中再判断一次max和num的值。num的初始值要为1而不是0。代码class Soluti

2021-12-02 00:25:19 840

原创 LC15.三数之和

题目查看题目解题思路注意点:在同一个数组中找符合要求的三个数字。注意[0,0,0,0]这种数组,也就是说要注意不能重复。思路一哈希解法:两层for循环就可以确定 a 和b 的数值了,可以使用哈希法来确定 0-(a+b) 是否在 数组里出现过,其实这个思路是正确的,但是我们有一个非常棘手的问题,就是题目中说的不可以包含重复的三元组。把符合条件的三元组放进vector中,然后再去重,这样是非常费时的,很容易超时,也是这道题目通过率如此之低的根源所在。去重的过程不好处理,有很多小细节,如果

2021-11-30 21:18:55 300

原创 LC383.赎金信

题目查看题目解题思路(HashMap)此题使用的是HashMap结构,但是推荐的竟然是使用Hash数组的方式,着实使用数组会比较好一点的能节省空间损耗,但是这里先介绍Map的做法的吧,毕竟是第一时间想到的。主要思路:定义一个HashMap用来存储magazine中每个字母出现的次数,将字母作为key,将出现的次数作为value,遍历magazine中的每个字符,出现则将字数加1。遍历ransomNote中的每一个字符,如果字符未在map中出现或者map中对应字符的出现剩余出现次数为0,直接返回f

2021-11-28 11:51:55 269

原创 LC454.两数相加II

题目查看题目解题思路此题还是比较有意思的,区别于普通的四数之和,普通的四数之和不能使用哈希法,而这道题目是四个独立的数组,只要找到A[i] + B[j] + C[k] + D[l] = 0就可以,不用考虑有重复的四个元素相加等于0的情况,所以相对于题目18. 四数之和,题目15.三数之和,还是简单了不少!主要的解题思路:首先定义 一个map,key放a和b两数之和,value 放a和b两数之和出现的次数。遍历nums1和大nums2数组,统计两个数组元素之和,和出现的次数,放到map中。定义

2021-11-27 23:51:49 575

原创 LC1.两数之和

题目查看题目解题思路此题很容易想到的思路就是暴力做法(作为leetcode的第一道题,暴力解法也不是不行),但最好的方法是采用哈希表的方法(因为我们要快速判断是否存在某个符合要求的值),而且尽量不要采用set和数组的方法,原因如下:数组的大小是受限制的,而且如果元素很少,而哈希值太大会造成内存空间的浪费。set是一个集合,里面放的元素只能是一个key,而两数之和这道题目,不仅要判断y是否存在而且还要记录y的下表位置,因为要返回x 和 y的下表。所以set 也不能用。主要思路如下:使用Hash

2021-11-27 21:03:13 253

原创 LC202.快乐数

题目查看题目解题思路看似是一道数学问题,但要注意题目中的的第二点,然后重复这个过程知道这个数变为1,也可能是无限循环,这就说明在求和的过程中,sum会重复出现,所以当我们遇到了要快速判断一个元素是否出现在集合中的时候,就要考虑哈希的方法。所以此题的主要思路如下:创建一个Set的哈希结构,这里不使用数组是因为长度未知,如果是已知的话也可以采用数组来实现哈希表。定义一个求和函数,用来求解给定数字每一位的平方和。使用一个while循环,当n不等于1并且当前得到的每一位的平方和不在哈希表中时,进入循环

2021-11-27 14:33:02 58

原创 LC242.有效的字母异位同

题目查看题目解题思路使用数组来模拟哈希表,主要思想如下:创建一个长度为26的数组record。将字符串s转换为char类型的数组并进行遍历,遍历到字符后,将字符在字母表中对应位置的数组位置的值+1。将字符串t转换为char类型的数组并进行遍历,遍历到字符后,将字符在字母表中对应位置的数组位置的值-1。最后遍历record数组,如果里面有值不是0的位置,说明两个字符中的字符数量不一致,直接返回false即可,如果全部都是0,则返回true代码class Solution { pu

2021-11-26 23:51:49 167

原创 面试题02.07.链表相交

题目查看题目解题思路此题之前写过一次,用的是一个非常浪漫的做法“我走过你来时的路,则我们一定会相遇”,核心思想就是两个链表的指针即走自己的链表,同时也走对方的链表,如果两个链表是相交的,那么两个指针一定会走到一起,从而完成判断。但这次用一个比较好理解和实现的方法(时间复杂度会高一点,空间复杂度不变),思想如下:首先算出两个链表的长度,并求出两个链表之间长度的差值。长的链的指针偏移两个链表长度差值的距离,将两个链表拉到同一个起跑线上去,然后同时开始遍历,如果两个指针指向同一个元素,证明链表相交。反

2021-11-26 21:44:37 149

原创 LC24.两两交换链表中的节点

题目查看题目解题思路虽然用了辅助指针,但主要还是双指针的思路。主要思想如下:当head为null或者链表中只有一个元素的时候,直接返回head即可。设置三个指针,双指针(右指针:right;左指针:left),辅助指针(用来记录left指针的前一个位置)。left的next为right,局部调换位置的时候,left.next = right.next ,right.next = left ,此时会出现一个问题,就是right.next指向left,此时left的前一个指针也指向left,这就导

2021-11-26 00:25:00 219

原创 LC203.移除链表元素

题目查看题目解题思路链表的基本操作,使用双指针完成链表元素的删除,快指针用来找到节点值与规定数值的相同的节点,慢指针完成删除操作。代码/** * Definition for singly-linked list. * public class ListNode { * int val; * ListNode next; * ListNode() {} * ListNode(int val) { this.val = val; } * List

2021-11-24 22:03:55 297

原创 JZ29.顺时针打印矩阵

题目查看题目思路坑:要看清楚题目要求,顺时针打印矩阵而不是方阵,所以行和列的长度不一样,要单独进行判断,千万别当成方阵进行求解。具体算法** 空值处理**:当matrix为空时,直接返回空列表[ ]即可(可以判断行和列的长度是否为0,注意判断顺序,先行后列)。初始化: 矩阵 左、右、上、下四个边界l,r,t,b,用来存储的ArrayList列表res。循环打印:“从左到右,从上到下,从右到左,从下到上”四个方向循环,每个方向打印中做一下三件事(不同方向的具体操作如表);根据边界打印,

2021-11-21 09:46:36 95

原创 LC59.螺旋矩阵II

题目查看题目思路之前看的代码随想录的思路,感觉会比较难理解,感觉题解中的K神的思路还是比较好理解的,所以还是用一下K神的思路吧。思路如下:生成一个n * n的空矩阵res,随后模拟整个向内环绕的填入过程:定义当前左右上下边界l,r,t,b,初始值num = 1,迭代终止值为tar = n * n;当num <= tar时,始终按照从左到右,从上到下,从右到左,从上到下填入顺序循环,每次填入后。执行num += 1:得到洗一个需要填入的数字;更新边界:列如从左到右填完后,上边界t

2021-11-20 22:13:57 468

原创 测试用(文章图床使用)

2021-11-18 15:09:55 55

原创 LC209.长度最小的子数组

题目查看题目解题思路最容易想到的思路就是暴力破解,用两个for循环进行遍历,直到找到合适的子数组,然后输出结果。但是这里有一个经典的做法:滑动窗口。滑动窗口的做法有点类似与双指针。主要思路如下:在本题中实现滑动窗口,主要确定如下三点:窗口内是什么?如何移动窗口的起始位置?如何移动窗口的结束位置?窗口就是 满足其和 ≥ s 的长度最小的 连续 子数组。窗口的起始位置如何移动:如果当前窗口的值大于s了,窗口就要向前移动了(也就是该缩小了)。窗口的结束位置如何移动:窗口的结束位置就是遍历

2021-11-18 00:21:25 416

原创 LC977.有序数组的平方

题目查看题目解题思路本题最容易想到的思路就是:先将数组中的所有的元素进行平方,然后将计算后的数组进行一次排序。但此时的时间复杂度为O(nlogn),题目建议最好控制时间复杂度控制在O(n)内,这就意味着要在一次遍历中的将数组构造出来。所以可以考虑使用双指针的思路:创建一个新的数组,长度与原始数组长度相同,用来接收遍历到并进行计算后的数字。创建两个指针,一个指针指向原始数组的第一个元素,另一个指针指向原始数组的最后一个元素。为新的数组创建一个指针,指向数组的最后一个位置。两个指针指向的元素平

2021-11-17 21:29:57 66

原创 LC404.左叶子之和

题目查看题目解题思路此题还有另外一种写法,但是这种我感觉比较好理解。最需要注意的点:这里求的是所有左叶子节点的和,所以要判断该点是不是左叶子节点,但是要判断一个节点是不是左叶子节点,从其本身是无法进行判断的(自身只能判断自己是不是叶子节点,而不能判断自己是不是左叶子节点),因此要从其父亲节点进行判断,即要判断该节点是不是左叶子节点,分三步:判断存不存在左子树(root.left!=null)再次声明,是从其父亲节点的角度进行判断的,如果上述条件满足,证明存在左子树。判断该点是不是叶子节点,(

2021-11-16 22:25:01 73

原创 LC101.对称二叉树

题目查看题目解题思路注意的点:因为是镜像对比,所以要用根节点的右子树和左子树对比,根节点的左子树和右子树进行比较,而不是对称(左子树左子树,右子树右子树)。因为节点树最少为1,所以在主函数里不需要判断只有一个节点的情况。我这里使用一个另外的函数(因为只用一个参数无法比较,而且返回的还是布尔类型,如果返回的是节点类型也可以,可以利用DFS找到最后的叶子节点然后进行比较,可惜不是),用来交叉比较子树的节点值。注意base case 当两个节点同时为NULL时,证明此时已经到了最后的节点且相等(n

2021-11-15 22:28:29 365

原创 LC543.二叉树的直径

题目查看题目思路对二叉树的理解还是差点意思啊。最初的思想:将左子树的深度和右子树的深度加起来即可。但是这里题目提示可能不经过根节点,所以要考虑这种特殊情况,即下图这种情况:很明显任意两节点最长的是[6,4,2,5,3]而不是简单的经过根节点的左右节点的深度之和。为了达到找到最长距离的要求,定义一个全局变量,用来存储当前最长的路径长度。递归中,比较左右子树的和与当前最长的路径进行比较,用来更新当前最长的路径长度。return Math.max(left,right)+1;// 返回该节点为

2021-11-14 22:07:38 4428

原创 LC100.相同的树

题目查看题目解题思路标签:深度优先遍历终止条件与返回值:当两棵树的当前节点都为 null 时返回 true当其中一个为 null 另一个不为 null 时返回 false当两个都不为空但是值不相等时,返回 false执行过程:当满足终止条件时进行返回,不满足时分别判断左子树和右子树是否相同,其中要注意代码中的短路效应时间复杂度:O(n)O(n),nn 为树的节点个数代码/** * Definition for a binary tree node. * public class

2021-11-14 20:35:09 167

DVWA配置二所需压缩包

适用于win10,64位机的DVWA压缩包,配合博客进行配置,与phpstudy一起使用效果更佳,将文件压缩至phpstudy中的www文件中,修改配置文件后即可使用

2020-11-09

phpstudy集成环境

配置DVWA的第一步,下载安装php的集成环境。这里上传的是配合博客中的步骤来的,适用于64位机,win10系统,当然大家也可以从官网上下。

2020-11-09

基于winsock编程嗅探工具实现设计报告.pdf

因为课程设计需要,写了一个基于WinSock编程的一个简单的抓包工具,完善了一下自己的设计报告,进攻参考,不要直接复制粘贴,编写不易,如有问题,欢迎指正。

2020-01-10

适用于VS2017的简易抓包

基于socket编程,完美适用于VS2017,可以实现简单的抓包以及协议分析,内含过滤器,包括对抓取数据的导入导出,以及解析内容的excel的导出。如果想免积分下载,请私信我。还是希望能够在弄清楚原理之后,自己写一写,直接使用的话还是不建议。当然,有大佬提出改进意见更是感激不尽。

2019-12-28

空空如也

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

TA关注的人

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