![](https://img-blog.csdnimg.cn/20201014180756757.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
算法
@逾越
记录日常学习实验
展开
-
LeetCode——75. 颜色分类(面试题)
原创 2022-01-27 21:02:59 · 5486 阅读 · 0 评论 -
LeetCode——1114. 按序打印(多线程)
1.问题描述2.解决办法构造屏障:构造两道屏障,second 线程等待 first 屏障,third 线程等待 second 屏障。first 线程会释放 first 屏障,而 second 线程会释放 second 屏障.Java 中,我们使用线程等待的方式实现执行屏障,使用释放线程等待的方式实现屏障消除。我们使用一个 Ojbect 对象 lock 实现所有执行屏障的锁对象,两个布尔型对象 firstFinished,secondFinished 保存屏障消除的条件。数累加:定义一个count原创 2022-01-26 10:58:47 · 5115 阅读 · 0 评论 -
LeetCode——46. 全排列
1.问题描述2.解决办法回溯法:每一位列出所有可能第一次swap的作用是构造出新的排列第二次swap的作用相当于回溯的过程3.代码实现class Solution { public List<List<Integer>> permute(int[] nums) { List<List<Integer>> arr =new ArrayList<List<Integer>>();原创 2022-01-24 10:57:22 · 5348 阅读 · 0 评论 -
LeetCode——100. 相同的树
1.问题描述2.解决办法广度优先遍历创建两个队列,将两个根节点分别放入队列中进行出队,并将两者各自的左右结点放入队列比较出队的结点的值是否相同,不相同直接返回false3.代码实现class Solution { public boolean isSameTree(TreeNode p, TreeNode q) { if (p == null && q == null) { return true; } el原创 2022-01-17 17:52:03 · 4785 阅读 · 0 评论 -
LeetCode——515. 在每个树行中找最大值
1.问题描述2.解决办法广度优先遍历:(经常使用)创建队列,队列是先进先出,并将根节点放入队列。判断根节点是否为空,为空直接返回res(ArrayList)还是以此放入队列 定义一个max同时赋值为Integer.MIN_VALUE,只要队列的数比他大就把值赋给max当一层遍历完,也就找到了第一层最大的数,放入res中接着再将max赋值为Integer.MIN_VALUE,再次遍历该层,后面以此类推。3.代码实现class Solution { public List<原创 2022-01-17 17:36:08 · 8333 阅读 · 0 评论 -
LeetCode——513. 找树左下角的值
1.问题描述2.解决办法广度优先遍历:(经常使用)创建队列,队列是先进先出,并将根节点放入队列。进行循环取出,当取出一个节点,就要把他的左右节点放入队列,一定先左后右因为是取左下角的值。每次取节点都要将第一个取值放入一个变量。因为它是左节点,直到遍历完所有节点,该变量就是最后左下角的值3.代码实现class Solution { public int findBottomLeftValue(TreeNode root) { Queue<TreeNode&g原创 2022-01-17 16:59:46 · 7589 阅读 · 0 评论 -
LeetCode——108. 将有序数组转换为二叉搜索树
1.问题描述2.解决办法二分法+递归首先数组是有序的,二叉搜索树也是有序的先找到数组的中间树mid,将他作为根节点他的左子树只能实在left——mid中产生,进行递归即可他的右子树只能实在mid——right中产生,进行递归即可3.代码实现class Solution { public TreeNode sortedArrayToBST(int[] nums) { return sortedArrayToBST(nums, 0, nums.length);原创 2022-01-17 16:23:53 · 4769 阅读 · 0 评论 -
LeetCode——64. 最小路径和
1.问题描述2.解决办法动态规划:该题和爬楼梯类似首先定义一个新的二维数组arr先从第一行:在新数组中原位置上存放,原位置+上位置的和再从第一列:在新数组中原位置上存放,原位置+上位置的和因为中间的数可能会有上右两路的选择,所以我需要先求出第一行和第一列,从中选取最小的值。在新数组中原位置上存放,原位置+min(上位置,右位置)的和3.代码实现class Solution { public int minPathSum(int[][] grid) { int n原创 2022-01-17 16:09:00 · 8678 阅读 · 0 评论 -
LeetCode——222. 完全二叉树的节点个数
1.问题描述2.解决办法1.迭代法创建一个队列,将根节点放如将root出队的同时将左右孩子放进队列,保证while循环出队一个,累加一个3.代码实现class Solution { // 迭代法 public int countNodes(TreeNode root) { if (root == null) return 0; Queue<TreeNode> queue = new LinkedList<>();原创 2022-01-16 20:43:09 · 4799 阅读 · 0 评论 -
LeetCode——104/111.二叉树的最大深度和最小深度
1.问题描述2.解决办法最大深度:递归三部曲:1 确定递归函数的参数和返回值参数为当前二叉树根节点的指针,返回值为当前二叉树的最大深度。2 明确递归终止条件遇到空节点,返回0,表明上一层已经是叶子节点,深度不会再增加了。3 确定单层递归逻辑当前二叉树的最大深度,如果当前二叉树根节点为空,则返回0,否则返回其左子树的最大深度leftHeight和右子树的最大深度rightHeight的较大值+1(1代表根节点这一层的深度)。最小深度:三种情况:左孩子为空 那么右的深度+1右孩子原创 2022-01-16 20:35:46 · 4608 阅读 · 0 评论 -
链表实现栈和队列
链表实现栈1.理解栈:先进后出的形式。入栈:定义一个head指针;利用头插法进行入栈。出栈:判断是否为空,不为空,将head的值取出,将head后移。2.代码实现private ListNode head;public LinkZhan() {}@Overridepublic String toString() { return "LinkZhan{" + "head=" + head + '}';}public voi原创 2022-01-16 18:26:25 · 4870 阅读 · 0 评论 -
金银铜奖牌排序
金银铜奖牌排序题目描述奥运会开始了,想请你为各个国家和地区做奖牌排序,按照金牌>银牌>铜牌的格式进行排序输入第一行 告诉你共有n个国家接来下的n 行 每行三个数字 分别代表 金牌数量 银牌数量 铜牌数量 中间用空格隔开输出输出n行 每行三个数字 按照题意进行排序样例输入51 2 32 3 41 4 61 4 30 3 4样例输出2 3 41 4 61 4 31 2 30 3 4解决办法首先这是一个二维数组排序public class jinyi原创 2022-01-16 17:58:44 · 6225 阅读 · 0 评论 -
LeetCode——107. 二叉树的层序遍历 II
目录1.问题描述2.解决办法3.代码实现1.问题描述2.解决办法方法一:广度优先搜索树的层次遍历可以使用广度优先搜索实现。从根节点开始搜索,每次遍历同一层的全部节点,使用一个列表存储该层的节点值。3.代码实现class Solution { public List<List<Integer>> levelOrderBottom(TreeNode root) { List<List<Integer>> levelOrder原创 2022-01-14 11:17:02 · 4374 阅读 · 0 评论 -
LeetCode——150. 逆波兰表达式求值
目录1.问题描述2.解决办法3.代码实现1.问题描述2.解决办法1.栈如果遇到操作数,则将操作数入栈;如果遇到运算符,则将两个操作数出栈,其中先出栈的是右操作数,后出栈的是左操作数,使用运算符对两个操作数进行运算,将运算得到的新操作数入栈。2.数组模拟栈如果遇到操作数,则将操作数入栈,因此栈内元素增加 1 个;如果遇到运算符,则将两个操作数出栈,然后将一个新操作数入栈,因此栈内元素先减少 2 个再增加 1 个,结果是栈内元素减少 1 个。3.代码实现class Solution {原创 2022-01-13 20:36:56 · 4382 阅读 · 0 评论 -
LeetCode——15. 三数之和
目录1.问题描述2.解决办法3.代码实现1.问题描述2.解决办法排序+双指针排序后,如果第一个数都大于0;则后面的之和一定大于0保证当前数和前一个的数不一样,避免重复for 循环每一个数 左右指针分别指向i+1和数组最后一个数判断三个指针指向是否等于0,如果不等于,大于0则右指针向左移,小于0则左指针向右移3.代码实现class Solution { public List<List<Integer>> threeSum(int[] nums) {原创 2022-01-10 17:37:54 · 4704 阅读 · 0 评论 -
LeetCode——454. 四数相加 II
目录1.问题描述2.解决办法3.代码实现1.问题描述2.解决办法题目是四个独立的数组,只要找到A[i] + B[j] + C[k] + D[l] = 0就可以,不用考虑有重复的四个元素相加等于0的情况。我们只需要遍历前两个数组将两数组和的可能和次数放入map中统计剩余的两个元素的和,在map中找是否存在相加为0的情况,同时记录次数3.代码实现class Solution { public int fourSumCount(int[] nums1, int[] nums2, int原创 2022-01-10 15:43:02 · 4288 阅读 · 0 评论 -
LeetCode——202. 快乐数
目录1.问题描述2.解决办法3.代码实现1.问题描述2.解决办法因为是无限循环,那么也就是说求和的过程中,sum会重复出现,这对解题很重要!判断这个sum是否重复出现,如果重复了就是return false, 否则一直找到sum为1为止。3.代码实现class Solution { public boolean isHappy(int n) { Set<Integer> record = new HashSet<>(); while原创 2022-01-10 15:24:13 · 4313 阅读 · 0 评论 -
LeetCode——142. 环形链表 II
1.问题描述2.解决办法第一步:判断链表是否有环fast指针一定先进入环中,如果fast指针和slow指针相遇的话,一定是在环中相遇,这是毋庸置疑的。快慢指针。第二步:如果有环,如何找到这个环的入口从头结点出发一个指针,从相遇节点 也出发一个指针,这两个指针每次只走一个节点, 那么当这两个指针相遇的时候就是 环形入口的节点。3.代码实现public class Solution { public ListNode detectCycle(ListNode head) {原创 2022-01-08 20:34:10 · 4386 阅读 · 0 评论 -
LeetCode——面试题 02.07. 链表相交
目录1.问题描述2.解决办法3.代码实现1.问题描述2.解决办法双指针:我们需要先找到两个链表的长度,求差值。让较长的链表先移动差值量,然后将两个链表指向同时向后移动。直到两指向值相同,返回结果。如果没有相同返回null。3.代码实现public class Solution { public ListNode getIntersectionNode(ListNode headA, ListNode headB) { ListNode curA = headA;原创 2022-01-08 19:35:09 · 4369 阅读 · 0 评论 -
数组理论基础和经典类型
目录1.数组定义2.数组性质3.经典类型1.二分法2.双指针法3.滑动窗口1.数组定义数组是存放在连续内存空间上的相同类型数据的集合。2.数组性质数组下标都是从0开始的。数组内存空间的地址是连续的因为数组的在内存空间的地址是连续的,所以我们在删除或者增添元素的时候,就难免要移动其他元素的地址。数组的元素是不能删的,只能覆盖。二维数组在内存中不是 n*m 的连续地址空间,而是m条连续的地址空间组成3.经典类型1.二分法前提:数组为有序数组,同时题目还强调数组中无重复元素,因为一旦有重原创 2022-01-07 10:18:43 · 4582 阅读 · 0 评论 -
LeetCode——59. 螺旋矩阵 II
目录1.问题描述2.解决办法3.代码实现1.问题描述2.解决办法生成一个 n×n 空矩阵 mat,随后模拟整个向内环绕的填入过程:定义当前左右上下边界 l,r,t,b,初始值 num = 1,迭代终止值 tar = n * n;当 num <= tar 时,始终按照 从左到右 从上到下 从右到左 从下到上 填入顺序循环,每次填入后:执行 num += 1:得到下一个需要填入的数字;更新边界:例如从左到右填完后,上边界 t += 1,相当于上边界向内缩 1。使用num <= t原创 2022-01-06 19:55:49 · 4343 阅读 · 0 评论 -
LeetCode——209. 长度最小的子数组
目录1.问题描述2.解决办法1.滑动窗口3.代码实现1.问题描述2.解决办法1.滑动窗口滑动窗口:就是不断的调节子序列的起始位置和终止位置,从而得出我们要想的结果。窗口就是 满足其和 ≥ s 的长度最小的 连续 子数组。窗口的起始位置如何移动:如果当前窗口的值大于s了,窗口就要向前移动了(也就是该缩小了)。窗口的结束位置如何移动:窗口的结束位置就是遍历数组的指针,窗口的起始位置设置为数组的起始位置就可以了。3.代码实现class Solution { // 滑动窗口原创 2022-01-06 19:15:45 · 4415 阅读 · 0 评论 -
LeetCode——27. 移除元素
目录1.问题描述2.解决办法1.双指针法3.代码实现1.问题描述2.解决办法1.双指针法双指针法(快慢指针法): 通过一个快指针和慢指针在一个for循环下完成两个for循环的工作。右指针 right 指向当前将要处理的元素,左指针 \left 指向下一个将要赋值的位置。如果右指针指向的元素不等于val,它一定是输出数组的一个元素,我们就将右指针指向的元素复制到左指针位置,然后将左右指针同时右移;如果右指针指向的元素等于 \textit{val}val,它不能在输出数组里,此时左指针不动,右原创 2022-01-06 18:54:46 · 4219 阅读 · 0 评论 -
LeetCode——235. 二叉搜索树的最近公共祖先
目录1.问题描述2.解决办法1.遍历3.代码实现1.问题描述2.解决办法1.遍历我们对从根节点开始,通过遍历找出到达节点 p 和 q 的路径,一共需要两次遍历。我们也可以考虑将这两个节点放在一起遍历。整体的遍历过程与方法一中的类似:我们从根节点开始遍历;如果当前节点的值大于 p 和 q 的值,说明 p 和 q 应该在当前节点的左子树,因此将当前节点移动到它的左子节点;如果当前节点的值小于 p 和 q 的值,说明 p 和 q 应该在当前节点的右子树,因此将当前节点移动到它的右子节点;如果原创 2022-01-04 11:54:22 · 4116 阅读 · 0 评论 -
LeetCode——653. 两数之和 IV - 输入 BST
目录1.问题描述2.解决办法1.使用 HashSet2.使用 BST(二叉搜索树)3.代码实现1.问题描述2.解决办法1.使用 HashSet最简单的方法就是遍历整棵树,找出所有可能的组合,判断是否存在和为 kk 的一对节点。现在在此基础上做一些改进。如果存在两个元素之和为 k,即 x+y=k,并且已知 x 是树上一个节点的值,则只需判断树上是否存在一个值为 yy 的节点,使得 y=k-x。基于这种思想,在树的每个节点上遍历它的两棵子树(左子树和右子树),寻找另外一个匹配的数。在遍历过程中原创 2022-01-04 10:44:15 · 4097 阅读 · 0 评论 -
LeetCode——733. 图像渲染
目录1.问题描述2.解决办法1.深度优先搜索3.代码实现1.问题描述2.解决办法1.深度优先搜索我们从给定的起点开始,进行深度优先搜索。每次搜索到一个方格时,如果其与初始位置的方格颜色相同,就将该方格的颜色更新,以防止重复搜索;如果不相同,则进行回溯。注意:因为初始位置的颜色会被修改,所以我们需要保存初始位置的颜色,以便于之后的更新操作。3.代码实现class Solution { int[] dx = {1, 0, 0, -1}; int[] dy = {0, 1,原创 2022-01-04 10:11:42 · 4018 阅读 · 0 评论 -
LeetCode——701. 二叉搜索树中的插入操作
文章目录1.问题描述2.解决办法3.代码实现1.问题描述2.解决办法首先回顾二叉搜索树的性质:对于任意节点 root 而言,左子树(如果存在)上所有节点的值均小于root.val,右子树(如果存在)上所有节点的值均大于 root.val,且它们都是二叉搜索树。因此,当将 val 插入到以 root 为根的子树上时,根据 val 与 root.val 的大小关系,就可以确定要将 val 插入到哪个子树中。如果该子树不为空,则问题转化成了将val 插入到对应子树上。否则,在此处新建一个以val原创 2022-01-03 12:05:55 · 4573 阅读 · 0 评论 -
LeetCode——3. 无重复字符的最长子串
文章目录1.问题描述2.解决办法1.滑动窗口3.代码实现1.问题描述2.解决办法1.滑动窗口定义一个 map 数据结构存储 (k, v),其中 key 值为字符,value 值为字符位置 +1,加 1表示从字符位置后一个才开始不重复我们定义不重复子串的开始位置为 start,结束位置为 end,随着 end 不断遍历向后,会遇到与 [start, end]区间内字符相同的情况,此时将字符作为 key 值,获取其 value 值,并更新 start,此时 [start, end]区间内不存在重复原创 2022-01-03 09:36:02 · 3833 阅读 · 0 评论 -
LeetCode——102. 二叉树的层序遍历
文章目录1.问题描述2.解决办法1.广度优先搜索3.代码实现1.问题描述2.解决办法1.广度优先搜索利用队列实现,将根节点先放入对列,然后弹出结点,判断其是否有结点,有就放入对列,创建新的Listlevel来存放,这样每一层的结点都会在同一个level中3.代码实现class Solution { public List<List<Integer>> levelOrder(TreeNode root) { List<List<In原创 2022-01-02 19:46:36 · 3848 阅读 · 0 评论 -
LeetCode——104. 二叉树的最大深度
文章目录1.问题描述2.解决办法1.深度优先搜索3.代码实现1.问题描述2.解决办法1.深度优先搜索如果我们知道了左子树和右子树的最大深度 l和r,那么该二叉树的最大深度即为 max(l,r)+1 而左子树和右子树的最大深度又可以以同样的方式进行计算。因此我们可以用「深度优先搜索」的方法来计算二叉树的最大深度。具体而言,在计算当前二叉树的最大深度时,可以先递归计算出其左子树和右子树的最大深度,然后在O(1) 时间内计算出当前二叉树的最大深度。递归在访问到空节点时退出。3.代码实现class原创 2022-01-02 19:28:06 · 3929 阅读 · 0 评论 -
LeetCode——19. 删除链表的倒数第 N 个结点
文章目录1.问题描述2.解决办法1.计算长度2.栈结构3.代码实现1.问题描述2.解决办法1.计算长度一种容易想到的方法是,我们首先从头节点开始对链表进行一次遍历,得到链表的长度 L。随后我们再从头节点开始对链表进行一次遍历,当遍历到第 L-n+1个节点时,它就是我们需要删除的节点。2.栈结构我们也可以在遍历链表的同时将所有节点依次入栈。根据栈「先进后出」的原则,我们弹出栈的第 n 个节点就是需要删除的节点,并且目前栈顶的节点就是待删除节点的前驱节点。3.代码实现class Solutio原创 2022-01-02 19:21:24 · 3761 阅读 · 0 评论 -
LeetCode——876. 链表的中间结点
文章目录1.问题描述2.解决办法1.数组法2.快慢指针3.代码实现1.问题描述2.解决办法1.数组法将结点的每个值都放入数组中,然后找到中间值;2.快慢指针用两个指针 slow 与 fast 一起遍历链表。slow 一次走一步,fast 一次走两步。那么当 fast 到达链表的末尾时,slow 必然位于中间。3.代码实现class Solution { public ListNode middleNode(ListNode head) { ListNode[] A原创 2022-01-02 19:11:49 · 3842 阅读 · 0 评论 -
LeetCode——557. 反转字符串中的单词 III
文章目录1.问题描述2.解决办法1.使用额外空间3.代码实现1.问题描述2.解决办法1.使用额外空间开辟一个新字符串。然后从头到尾遍历原字符串,直到找到空格为止,此时找到了一个单词,并能得到单词的起止位置。随后,根据单词的起止位置,可以将该单词逆序放到新字符串当中。如此循环多次,直到遍历完原字符串,就能得到翻转后的结果。3.代码实现class Solution { public String reverseWords(String s) { StringBuffer原创 2022-01-01 11:47:36 · 4244 阅读 · 0 评论 -
LeetCode——349. 两个数组的交集
文章目录1.问题描述2.解决办法1. 排序+双指针3.代码实现1.问题描述2.解决办法1. 排序+双指针排序后 第一数组用指针index1指向 第二数组用指针index2指向index1指向和index2指向比较如果相等放入新数组如果index1<index2将index1右移动如果index1>index2将index2右移动如果index1=index2将index1和index2同时右移动该函数Arrays.copyOfRange函数是将intersection原创 2021-12-31 20:35:04 · 4377 阅读 · 0 评论 -
LeetCode——167. 两数之和 II - 输入有序数组
文章目录1.问题描述2.解决办法1.二分法查找2.双指针3.代码实现1.问题描述2.解决办法1.二分法查找在数组中找到两个数,使得它们的和等于目标值,可以首先固定第一个数,然后寻找第二个数,第二个数等于目标值减去第一个数的差。利用数组的有序性质,可以通过二分查找的方法寻找第二个数。为了避免重复寻找,在寻找第二个数时,只在第一个数的右侧寻找。2.双指针初始时两个指针分别指向第一个元素位置和最后一个元素的位置。每次计算两个指针指向的两个元素之和,并和目标值比较。如果两个元素之和等于目标值,则发现了原创 2021-12-31 10:47:29 · 3808 阅读 · 0 评论 -
LeetCode——(145.145.94) 二叉树的(前,中,后)序遍历
文章目录1.问题描述2.解决办法1.首先理解前中后序遍历的形式2.递归3.代码实现1.问题描述给定一个二叉树,分别进行前中后序的遍历。例如:给你数组【5,8,9,4,7】2.解决办法1.首先理解前中后序遍历的形式前序:根节点->左节点->右节点中序:左节点->根节点->右节点前序:左节点->右节点->根节点2.递归以后序为例:定义函数postorder(root) 表示当前遍历到 root 节点的答案。按照定义,我们只要递归调用 postord原创 2021-12-31 10:09:28 · 3875 阅读 · 0 评论 -
LeetCode——36. 有效的数独
文章目录1.问题描述2.解决办法1.哈希表3.代码实现4.补充总结1.HashMap2.HashSet1.问题描述2.解决办法1.哈希表1.由于board中的整数限定在1到9的范围内,因此可以分别建立哈希表来存储任一个数在相应维度上是否出现过。2.遍历到每个数的时候,例如boar[i][j],我们判断其是否满足三个条件:在第 i 个行中是否出现过在第 j 个列中是否出现过在第 j/3 + (i/3)*3个box中是否出现过.为什么是j/3 + (i/3)*3呢?3.关于从数组下标到原创 2021-12-29 22:06:57 · 4218 阅读 · 0 评论 -
LeetCode——83. 删除排序链表中的重复元素
文章目录1.问题描述2.解决办法1.遍历3.代码实现1.问题描述2.解决办法1.遍历因为是升序,所以重复的元素在链表中出现的位置是连续的我们从指针 cur 指向链表的头节点,随后开始对链表进行遍历。如果当前 cur 与cur.next 对应的元素相同,那么我们就将cur.next 从链表中移除;否则说明链表中已经不存在其它与 cur 对应的元素相同的节点,因此可以将 cur 指向 cur.next。当遍历完整个链表之后,我们返回链表的头节点即可。3.代码实现class Solution {原创 2021-12-29 11:36:56 · 3802 阅读 · 0 评论 -
LeetCode——206. 反转链表
文章目录1.问题描述2.解决办法1.迭代3.代码实现1.问题描述2.解决办法1.迭代在遍历链表时,将当前节点的 next 指针改为指向前一个节点。由于节点没有引用其前一个节点,因此必须事先存储其前一个节点。在更改引用之前,还需要存储后一个节点。最后返回新的头引用。所以我们定义pre 指向前一个节点并定义为null, 定义一个next指向下一个节点,如果当前结点不为空,则先将该节点的下一个节点暂存到新定义的next(非常重要,要不无法往后继续),然后讲该节点的next指向pre,以此pre和新定义原创 2021-12-29 11:18:57 · 3898 阅读 · 0 评论 -
LeetCode——21. 合并两个有序链表
文章目录1.问题描述2.解决办法1.递归法3.代码实现1.问题描述2.解决办法1.递归法 1.如果 l1 或者 l2 一开始就是空链表 ,那么没有任何操作需要合并,所以我们只需要返回非空链表。 2.我们要判断 l1 和 l2 哪一个链表的头节点的值更小,然后递归地决定下一个添加到结果里的节点。如果两个链表有一个为空,递归结束。3.代码实现 //合并两个有序链表public ListNode mergeTwo(ListNode l1,ListNode l2){ if (l1==原创 2021-12-28 15:42:46 · 4008 阅读 · 0 评论