算法
文章平均质量分 70
Achlorine
脚下的路更重要,我要开始与自己赛跑了。
展开
-
BFS离入口最近的出口
因为我们想一下我们逐层遍历每一层就是它的上下左右,那么它的上下左右中我们遇到的第一个出口就一定是我们的最近的出口那么最近的出口的距离多少呢?其实就是我们遍历的层数就是我们的距离.那么代码如下。这里有个巧妙的做法那就是我们用一个数组去记录一下出口然后我们判断的时候只需要判断此时的坐标在这个二维数组中的值是不是1就可以知道是不是出口了.这个题目的意思就是说一个人在一个入口处要求找到一个出口使得这个出口距离入口最近出口,那么什么是出口呢?这里四条边上的就是出口.其中加号是墙,'.'是可以走的路.原创 2024-03-26 23:20:25 · 231 阅读 · 0 评论 -
FloodFill算法——力扣被围绕的区域
很简单那就是求没有被围绕的O然后将这些O变成随便的一个字符只要不是X或者O就行然后再将此时剩下的O全部变成X把你当时转换的字符重新转换成O就可以了,那么我们就要知道哪些O是不能被围绕的呢?我们来解读一下这个题目,这个题目的意思就是求出被X围绕的O有多少个,那么什么是被围绕呢?也就是没有出路并且连通的O不能到四条边上,这就算是被围绕了,可是即使知道了这些信息我们依旧头大因为,太难分析了我们遇到一个O之后还得去看看这一块儿O是不是被围绕的如果不是被围绕的还得去将他们回复成原来的O很难的了。原创 2024-03-24 23:19:32 · 296 阅读 · 0 评论 -
有人相爱,有人夜里开车看海,有人leetcode第一题都做不出来。
题目很简单那就是在一个数组中找到两个数字使其相加的和等于k并返回这两个数的下标即可那么直接就是两层for循环就可以了。第一层for循环确定第一个数,第二个for循环在第一个的前提下逐个遍历看看能否找到与其相加等于k的数字从而返回。有人相爱,有人夜里开车看海,有人leetcode第一题都做不出来。那么我们今天就来看看力扣的第一题吧。原创 2024-03-23 23:47:28 · 150 阅读 · 1 评论 -
FloodFill算法——岛屿数量
那么这个问题应该采取何种思路和方法呢?还记得BFS的步骤嘛?走前走后走左右,顾前顾后顾左右,满足要求改为true,不满要求不进队,那么这个题目我们按照我编的这个句子来看一下,首先用两层for循环取遍历这里面所有的节点,当节点为1的时候我们就来看看,它的前后左右如果,然后将他的前后左右满足条件的进入队列,并将 加入队列的元素逐个遍历去获取他们的前后左右,并且这还不是最主要的是需要对我们遍历到的节点进行标记。从而保证符合要求的节点只会被我们遍历一次。原创 2024-03-22 22:51:36 · 273 阅读 · 0 评论 -
FloodFill算法——图像渲染
从上面对于算法的解析种我们其实应该是对每一个遍历到的节点加一个标志位的但是这个题目不用因为这个题目的主要要求是,符合条件的节点的值全部转换为题目要求的值因此我们可以发现即使没有标记位只需要记录初始位置的值然后逐个匹配即可。这个题目的意思在这类题目中也是非常标准的,就是给我们一个二维数组然后会再给我们一个坐标要求是我们以这个坐标为起点向四周延申,在这个过程中只有等于我们初始坐标这个值然后让这些值赋值为题目要求的值即可。我们来解读一下题目内容这个题目的意思其实就是有一个如下图所示的二维矩阵。原创 2024-03-22 22:16:00 · 306 阅读 · 0 评论 -
基本计算器II
最后一步就简单了我门只需要将栈中元素逐个弹出并且相加即可。原创 2024-03-10 01:17:38 · 286 阅读 · 0 评论 -
力扣——删除字符串所有相邻重复项
我们来看一下这个题目这个题目其实跟我们的消消乐一样,首先就是给你一个字符串然后呢两个相邻的字符串如果相等的话就消除,但是大家注意消除后可能原本相同但是不相邻的元素会变得相邻因此我们要处理好这种情况那么该怎么办呢?在这里我们发现此时栈顶的元素和接下来要放入的元素相同了因此此时我们可以让栈顶元素出栈并且接下来要放入的元素不放入就达到了消除的效果我们来看一下。然后我们发现接下来要放入的元素又跟此时的栈顶元素相同因此重复上面的步骤。然后我们发现此时栈为空那么接下来就需要我们进行继续入栈了。原创 2024-03-09 00:53:26 · 326 阅读 · 0 评论 -
力扣——合并k个升序链表
我们假设每个链表的节点个数为n总共有m个链表那么每一次都需要两两比对,并且每一次新的链表长度都会增加,因此最终的时间复杂度是O(mn^2)这个时间复杂度是很可怕的,因为如果m和n的数字比较接近的话那么时间复杂度就直逼三次方了。利用优先级队列进行优化,我们可以将这些链表的头节点放入一个优先级队列中之后每当出去一个节点就将出去的这个节点的next节点放入优先级队列中。这个题目的思想运用过来我们合并两个链表的时候是用两个指针那么我们合并多个链表的时候也可以两两合并啊。那么这样子的话我们的时间复杂度如何呢?原创 2024-03-09 00:37:08 · 481 阅读 · 0 评论 -
算法之力扣数青蛙
我们以上面这个图为例,首先弄出一个表格这个表格第一行表示的是croak这五个字符每个字符的个数,然后用一个指针指向开头第一个字符在指针向后移动的过程中去改变表中的数字即可首先先看第一个字符是c因此先将c这个表格弄为1。当下面的指针向后移动到r的时候先查看表格中r前面的那个字符是不是大于0,之后如果大于那就是num[‘r’]++然后num[‘c’]–;之后当指针再次向后移动的时候下一个字符为c我们可以看到c这个字符经过第二步变成了0并且k也是0因此我们让c再++原创 2024-02-18 17:07:21 · 423 阅读 · 0 评论 -
leetcode——将x减到0的最小操作数
第一次看到这个题目的时候可能会有些发懵尤其是这个题目的提示说我们需要更改数组这势必会引起一些误导让我们以为需要在原数组上进行更改,但是其实这个题目并不需要那么麻烦,我们想一下假设一个数组的各个元素和为sum,对于一个数组来说我们消除两边的数字使得消除的数字和恰好等于x那么对于剩下的数字,不就是sum-x吗?我们来解析一下这个题目其实也很简单说的是给你一个整数和一个数组问你每当移除最左边和左右边的某个数字时x也减去该元素的值,问你这里面的最佳方案是什么。(最佳方案的意思也就是删除最少的元素个数)原创 2024-01-19 14:34:23 · 468 阅读 · 0 评论 -
滑动窗口经典入门题-——长度最小子数组
那么我们可以想一下我们可以使用两个指针一个是left一个是right当left和right之间的元素和小于target的时候就让right一直向右移动,当right和left之间的元素大于等于target的时候我们更新一下此时的长度是否为最短,然后再让left左移查看此时right和left的元素之和是否大于等于target如果是就继续上一步操作即继续更新我们的最短长度,一直到right和left之间的数据小于target为止之后再让right指针右移即可。通过调整这两个指针,可以滑动窗口在序列上移动。原创 2024-01-18 22:53:18 · 775 阅读 · 0 评论 -
力扣电话号码的组合
首先呢我们可以先看一下假如说是23这两个数字的话2代表的是abc 3代表的是def,那么我们以此为列的话得出当首字符是a的时候组合就是ad,ae,af同样的b和c也是如此在这里我们可以看到a组合完毕之后我们还需要将b和c组合也给列出来,那么也就是说我们可以利用函数递归这样一个特性去逐步的遍历他们每个字符串,也就是说最外层是一个for循环然后for循环里面是一个函数递归,相当于又是一个循环外面的循环负责遍历2这个数字代表的字符内层函数遍历则是负责遍历3所代表的每个字符,那么我们来进行一下代码实现吧。原创 2024-01-16 20:57:37 · 395 阅读 · 0 评论 -
力扣算法之滑动窗口题目--水果成篮
那么首先我们要先知道我们这个篮子里的种类数有多少,那这样的话就需要我们有一个变量去保存这个窗口内的种类数,其次我们则么知道这个数字在不在窗口内呢,很简单用一个hash表去记录一下就可以了啊因为我们要注意这个数字是大于0的所以我们可以直接用一个一维数组的下标去判断即可,那么在这个窗口内的元素就让hash[num[i]]++(假设num[i]这个数字在这个窗口内)这样字就可以知道这个数字在窗口内,如果需要出窗口的话同样也只需要我们hash[num[i]]–;首先我们先看一下题目如下图所示。原创 2024-01-16 22:57:32 · 1042 阅读 · 0 评论