- 博客(58)
- 收藏
- 关注
原创 对于IIC的理解
每发送一个数据后需要从机需要发送一个应答信号.(应答信号为接收器发送,意在高速发送器成功接收信号)二:在数据发送的过程中,SCL低电平,主机向SDA中写入数据0,或者1。在接收数据的过程中,SCL低电平,从机向SDA中写入数据0,或者1。发送器每次发送完一个字节数据后,释放对SDA的控制,转而由接收器控制,从而拉低SDA发送应答位。注意:在停止条件和开始条件发送的过程中,SCL和SDA两条线都由主机掌控。停止的条件SCL为低电平的状态下,SDA从低电平变为高电平。下面主要是对一主多从的详细介绍。
2024-11-05 22:35:08 225
原创 贪心算法跳跃游戏1and2
在走的过程中选择下一次能走到的最远路程,当走到当前的最远路程后。给当前路程赋值,赋值内容为刚刚计算的下一次最远路程。每次的最大范围并不一定是max,因为之前走的数可能比之后走的数更大。可以先跳 1 步,从下标 0 到达下标 1, 然后再从下标 1 跳 3 步到达最后一个下标。看贪心的本质 :每次都取跳跃的最大范围,如果最后的答案就是整体的最大范围。数组中的每个元素代表你在该位置可以跳跃的最大长度。从下标为 0 跳到下标为 1 的位置,跳。判断你是否能够到达最后一个下标,如果可以,返回。向前跳转的最大长度。
2024-06-09 18:50:15 576
原创 贪心算法 之 股票 跳跃游戏1and2
随后,在第 4 天(股票价格 = 3)的时候买入,在第 5 天(股票价格 = 6)的时候卖出, 这笔交易所能获得利润 = 6 - 3 = 3。在第 2 天(股票价格 = 1)的时候买入,在第 3 天(股票价格 = 5)的时候卖出, 这笔交易所能获得利润 = 5 - 1 = 4。所以我们看到事情的本质就是后面的数和前面的数比差值。第一种i大于i+1的数,并且手里没有股票。for循环遍历每一个数,从i开始,每次判断i和i+1.有三种情况,第二种i小于i+1的数,并且手里没有股票。第三种当i小于i+1的数。
2024-06-09 18:37:07 343
原创 回溯算法总结
这类问题都有一个特点选择一个段,如果这一段满足某种条件那么就加入到path,也就是说可以往path里面加一个字符也可以加多个字符具体加多少需要用一个函数来判断。2:给的数组有重复,这样就有几率有重复的 所以需要去重 这种情况只需要给数组nums排序,在同一层里面不能选择相同的数。这累问题需要用一个数组就可以解决,如果用过就把他变成1没有用过变成0.最后回溯的时候记得把他重新变成0。1:给的数组没有重复 这个就简单按照模板直接出来,加一个sum来判断。这类问题需要一个i来判断path的数量。
2024-06-07 18:29:45 286
原创 回溯算法全排列
这里需要用到一个数组来判断,数组下标位i的数 是否用过,用过则continue。这是针对nums没有重复的数时,如果有重复的数时就排序之后再做。给定一个不含重复数字的数组。
2024-06-06 22:04:33 355
原创 回溯算法之递增子数列
数组中可能含有重复元素,如出现两个整数相等,也可以视作递增序列的一种特殊情况。第二:如果path数组中存在不止一个数,并且这个数大于nums[i]首先是unordered_set<int> uset;,找出并返回所有该数组中不同的递增子序列,递增子序列中。那么在排序中怎么判断该数是否出现呢?这题的难点是母数列是没有顺序的,并且不能修改其顺序。第一:这个数这一层已经被用过一次了。那么有哪些情况下需要用哈希表?剩下的就是for循环的部分。erase是删除数字。
2024-06-06 21:53:57 189
原创 回溯算法复原ip,子集1和子集2
所以如果是3段,那么直接判断剩下的代码是否为正确的字符串,如果是加到result里面去。开始思路:做这题时我首先想到的就是和昨天那题一样的截取段来操作,然后就写。思路: 因为我们看到ip是由四段组成的,所以直接先朝着终止条件进军,定义一个变量判断是次数是否为3,如果为三那么进来下剩下的字符都属于第四段。先做一个总结吧:今天三题里面有两题是纯手工自己完成的,并且三题的总和时长不到两个小时,这个成绩我还是很满意的。这里的begin是迭代器必须加,参数1是表示加在什么位置,参数2是加什么。
2024-06-05 21:01:56 564
原创 回溯之分割回文串
思路:直接看回溯函数的内容,首先我们是取段的,如果这一段不行那就往后面加1,直到加道循环结束。如果可以取端,并且取到了最后一段,也就是开始的startIndex大于等于size那么就代表这一条都是回文字符串。然后需要一个判断函数,判断字符串是否为回文字符串,如果是往path里面加。学到的新函数:array.substr( a ,b) a表示字符串的开始,b表示数量 含义:选取字符串array从a开始往后的b个数。难点:这里用到一个很取段的思路,其实和取点的内容差不多,但是取端更难理解。
2024-06-04 22:50:27 344
原创 回溯算法之组合总和2
下面是比较具体的思路:对排序好的数组进行回溯操作,用sum来统计和,如果大于target则retrun,如果等于就添加进去。在for循环中判读这个数和上个数是不是一样的,如果一样就contiune。思路:这题的难点就是理解什么情况下会出现重复的组合,因为给的数里面会存在 重复的数字,我们只需要在同一层不对相同的数进行拓展。学到一个函数:sort( array.begin(),array.end());中的每个数字在每个组合中只能使用。给定一个候选人编号的集合。解集不能包含重复的组合。中所有可以使数字和为。
2024-06-04 22:37:26 237
原创 回溯算法之电话号码字母组合
这题的难点就是将这个问题转换为回溯算法可以解决的问题,首先我们直到有一个数字组成的字符串digits,每个字符都代表着3到4个字母。也就是说要将每个字符串所代表的字符进行一个排练组合。在算法内部的难点有:1.判断数字字符所代表的字符串 2.对这些字符串进行排列组合(这里需要理清楚一个概念,每一次递归声明的都是一个新变量)给出数字到字母的映射如下(与电话按键相同)。注意 1 不对应任何字母。的字符串,返回所有它能表示的字母组合。
2024-06-02 16:56:36 347
原创 回溯算法指组合总和
这种问题是需要遍历每一个数排练组合一下。可以看到这是一个递减的n叉树。该列表不能包含相同的组合两次,组合可以以任何顺序返回。所以结束条件就是判断数组数量是否为k,for循环里面是9。并且需要一个sum和一个index来辅助回溯算法。最多为9个数,实际数量为k个数。所有可能的有效组合的列表。
2024-06-02 16:50:35 238
原创 回溯算法之简单组合
按照循环遍历 i 到 n 的数,在里面再次遍历 然后再遍历再遍历,直到把所有的数都遍历一遍。终止条件就是size达到k时。这里就是for循环,循环n次(相当于n叉树)是不是很酷,终于感觉到二叉树学了点啥了。其实也需要用到迭代,哈哈哈哈,但是这个暴力穷举真的好爽。今天结束了二叉树,开始回溯算法。先记一下回溯算法的基本框架吧。很简单,框架就已经写好了。这个还是可以看的很清楚的。但是后面就不太一样了。
2024-05-27 20:05:08 207
原创 算法:将有序数组转换为二叉搜索树
思路:这道题很显然用取中间值的方法,这里需要用到一个new创建一个节点,然后把mid给节点。思路就是递,递到最底部,然后归,归上来,依次把值附上去。排列,请你将其转换为一棵平衡二叉搜索树。题目:给你一个整数数组。
2024-05-25 23:51:34 210
原创 二叉树之修剪二叉树
思路:对于这道题目因为使用的是搜索二叉树,所以可以直接判断如果大于high了,那么当前节点以及节点右边都不能使用了,需要去找左边的树枝,如果小于low那么就去找右边的树枝。改变保留在树中的元素的相对结构 (即,如果没有被移除,原有的父代子代关系都应当保留)。所以结果应当返回修剪好的二叉搜索树的新的根节点。注意,根节点可能会根据给定的边界发生改变。还是老规矩:看到题目后想思路,只有把思路想好之后再写代码才能写的好。通过修剪二叉搜索树,使得所有节点的值在。给你二叉搜索树的根节点。
2024-05-25 23:46:55 126
原创 二叉搜索数之删除节点
看看第五种的操作,首先要了解二叉搜索数的特性,然后我们就可以知道当前节点如果删除,那么左边和右边都无家可归了,应该把左边的数融入到右边去(右边最小值)因为右边最小值都比左边的最大值大。所以只需要把左边的树放到右边,最后把root的右节点返回就可以了。对应的节点,并保证二叉搜索树的性质不变。返回二叉搜索树(有可能被更新)的根节点的引用。给定需要删除的节点值是 3,所以我们首先找到 3 这个节点,然后删除它。第二:删除的节点左边为空右边不为空。第三:删除的节点右边为空左边不为空。第一:找不到需要删除的节点。
2024-05-23 17:43:06 290
原创 二叉数之插入操作
思路:将整套流程看作一条线,由根节点然后通过二叉搜索数一路搜索到底部,最后如果为空就返回一个值为val的节点。,可能存在多种有效的插入方式,只要树在插入后仍保持为二叉搜索树即可。,将值插入二叉搜索树。返回插入后二叉搜索树的根节点。,新值和原始二叉搜索树中的任意节点值都不同。给定二叉搜索树(BST)的根节点。
2024-05-23 17:24:43 249
原创 二叉树之找祖先
实现:递归首先递往下发散,遇到空或者p,q时停止,所以确定终止条件。然后归,判断如果左右不为空return到cur,如果部分为空,那么return没有空的。首先直到最重要的一点就是如果q和p分别在当前节点的左边和右边,那么当且节点就是最近公共祖先。先找到p值或者q值,然后往上return,如果左右不为空return到cur,如果部分为空,那么return没有空的。内容:在递归体里面需要加上判断语句,如果left或者righ不为空那么就返回。最后在加一个返回,防止归的时候还是空的情况,和在中间的情况。
2024-05-22 18:29:07 138
原创 二叉树之寻找众数(方法一)(遍历全部内容)
第二个函数通过for循环找到和最多次一样的数,最后加到result里面。代码总共分为两个函数,一个是为哈希表添加内容,第二个是为对结果分析。第一:深化了对unordered_map这个哈希表的了解。第一个函数通过递归遍历每个数,然后统计数出现的次数。第二:对for循环的另外一种写法也有了更深的理解。
2024-05-21 12:20:44 161
原创 二叉树之验证二叉树和最小绝对差值
我们只要按照顺序进行比较或者算术就可以达到想要的效果,其中还需要在中序的时候对cur进行保存。收获就是更清楚得了解了前序中序和后序的操作(这两题都运用了中序的方法)其实还有另外一种方法,也是使用中序的,但是是用一个值和每个值进行比较。搜索二叉树以中序方式展开后其实就是一个连续的有规律的数组(从小到大)这两道题目其实都是和双指针有关的题目。所以可以总结出来一个事情。这个方法没有上一个好。看第二题是绝对误差值。
2024-05-19 15:09:04 116
原创 二叉树之合并二叉树和二叉搜索树
返回最高处时也要考虑一个return的接收值,因为终止条件是对底部或者快到底部的一个return,而我们肯定要return一个非底部,也就是中部的内容,比如说return root(当前节点)看上去是root实际上是上一个节点的left或者right。合并的规则是:如果两个节点重叠,那么将这两个节点的值相加作为合并后节点的新值;首先确定好终止条件(我开始以为遇到终止条件就一定是到了叶子节点位置了,其实这个话看上去是对了,但是如果细扣就不太对了,但大部分也都对,我之前理解有错误)返回以该节点为根的子树。
2024-05-16 17:40:25 292
原创 二叉树路径总和
题目大差不差,我直接说不同的地方,这个题目需要返回一个二维数组,每一行的值代表一条路,和为targetSum。但是我们在递归函数中用的是当前节点的下一个节点,所以传入的内容为targetSum-root->val。这里有一个很关键的点:因为我们要找到是否存在一条线路可以使节点值和为targetSum。结束条件和上面一个一样,但是结束条件里面的内容是吧一个一维数组加到二维数组里面。首先接收值:一个根节点,一个二维数组的引用,一个 targetSum。不存在 sum = 5 的根节点到叶子节点的路径。
2024-05-15 15:29:28 448
原创 二叉树找数左下角值
思路:肯定是使用递归的方法,并且实现的效果是,先到最左边,然后当为叶子结点的时候比较一下当前是否为最大深度,如果是更新最大深度,并且修改结果。如果不是直接return。然后退回一步,去看下一个路口。结束条件是:结点左边和右边都为空,if函数里的内容就是,更新最大深度,修改结果。退回上一个节点路口:在递归函数下面加上depth--题目很容易理解:就是找二叉树左下角的值。递归函数先后顺序:先左再右。
2024-05-14 23:25:09 127
原创 二叉树之左叶子的和
注意点:如果用cur->left == null && cur->right == null作为判断结束条件的话。如果该节点的左节点不为空,该节点的左节点的左节点为空,该节点的左节点的右节点为空,则找到了一个左叶子。在这个二叉树中,有两个左叶子,分别是 9 和 15,所以返回 24。如果用cur==null来作为结束条件就不用了。在进入递归函数是需要加一个if判断是否为空。这个还是很简单的只要抓住左叶子的要点。,返回所有左叶子之和。
2024-05-13 17:59:17 219
原创 二叉树之求所有路径
这里还有一个比较关键的点就是pop,要放在递归函数后面,因为要搞一条路,这条路走不通了往回走,那么当前的val就要pop掉。三个内容中,一般结束条件放在最前面,递归函数和执行动作会根据位置不同而影响结果。在这道题目中更进一步的了解了回溯,相当于这个不行了就往回然后再往另外一条路走,可以说在二叉树中的每一个递归都是这样的,而且是左边走完才走右边。函数:to_string将数转换为字符串类型。,返回所有从根节点到叶子节点的路径。先说说收获:递归可以看出3部分,给你一个二叉树的根节点。是指没有子节点的节点。
2024-05-13 17:55:04 286
原创 二叉树的最小深度和二叉树的节点数
判断如果函数左边为null但是右边不是null表示没用到最终位置所以返回一个rightdepth+1;代码意义:所有递归除了为空,都会使count + 1,而两个递归可以遍历所有的节点。代码内容:首先判读是否为空,空则返回count。判断函数是否为空,如果是空return 0;思路:和最大深度一样需要用到回溯递归的方法。思路:首先定义一个变量count = 0;定义一个变量接收递归函数返回的值(左)定义一个变量接收递归函数返回的值(右)这样就可以计算出来所有的节点数量。如果满的就返回两个之中的最小值。
2024-05-11 17:07:19 221
原创 算法二/N 叉树的最大深度
每一步迭代都要进行三步操作,分别是求左边的深度,求右边的深度,何返回最深深度。首先明确迭代的终止条件:当cur == null 时就return;我们回溯迭代的目的就是从底层开始,比较每一层的深度,然后返回最大深度。因为n叉树所以要比较最大的,但是max只能有两个比较对象,所以使用。所以要有返回值,返回值是前面两个节点的深度的最大值 + 1。最后一路返回到最上面,比较根节点下面的两个节点深度。题目一:二叉树的最大深度。思路:使用回溯迭代的思想。最深的和当前深度进行比较。记得还有一个for循环。
2024-05-11 13:11:56 204 1
原创 广度优先之求每一层的平均值
思路:这里运用递归只需要在每一次迭代时修改一下内容就可以。也就是每一次小递归中给当前深度加上cur->val。当递归结束后,每一层深度都代表这这层深度的和。然后在加数时,顺便给count数组也加一个数。
2024-05-08 13:45:04 248
原创 广度优先 之 层序遍历
这个比深度优先的代码多了一个深度,因为递归按照顺序递归下去的话,会到二叉树的叶子部分,但是我们不需要直接就加入叶子部分。所以需要用一个代表深度的变量来表示深度。对应的深度加入对应的值。首先我们需要一个递归的函数,因为我们对这个数组进行操作,所以按引用传入数组。因为有一个深度,我们需要在数组的size对于深度时,往二维数组中再加一行。终止条件是:cur为nullptr 此时直接return。然后往depth中加入一个cur指向的数值。如果要用到递归的方法需要想一下才能想明白。
2024-05-07 12:51:24 215
原创 二叉树之迭代法遍历
注意这里是栈,所以我们先把righr放进入,然后再放left。思路大致一样,就是把if左右的顺序改一下,最后把数组顺序调换。循环的判断条件分别为,cur!= NULL || 栈不为空。if()如果root->right不为空 push到栈中。里面有两条路,一条是直接往左走走到底,还有一条是else。if()如果root->left不为空 push到栈中。把根节点对应的val放到数组result中,然后开始while,退出条件为栈不为空。找到栈位置后判断右边的路,最后pop掉。使用迭代法遍历二叉树。
2024-05-05 18:28:17 164
原创 二叉树 遍历 之 递归法
在递归函数中(接收一个指针cur,和按引用获取一个数组),我们先判断当前值是否为空。这样写好后可以创建多个节点,然后给他们附上关系,那么就实现了一个二叉树。如果cur->right不是空那么就再次指向此函数。这是前序的,同理后续和中序就是修改位置就可以了。如果cur->left不是空那么就再次指向此函数。在构建一个二叉树的结构体中需要包含一下内容。把收到的cur指向的val传入数组中。2:下一个左结点的地址 left。3:下一个右结点的地址 right。思路:需要用到递归的思想。1:当前结点之val。
2024-05-05 17:00:08 131
原创 栈与队列 之 滑动窗口最大值
pop时需要判断删除的数是否为队列最早进入的值,也就是front。因为我们需要找的都是最大值,如果删除的val小于最大值,并且位于最大值之前,那么它在最大值加入进来时就被pop了。如果新值的大小成为了最大的,那么前面的几个数也就没有必要记下来了,因为直到它们被去除,最大值依然是新值。push时需要判断前面的值是否大于新val,如果小于就pop前面的值,如果大于就跟在它后面。的滑动窗口从数组的最左侧移动到数组的最右侧。所以我们需要判断的就是这个新值,在滑动窗口内的大小排名,和老值的大小排名。
2024-05-03 19:31:15 391
原创 栈的使用之逆波兰表达式求值
这种题目我称其为过程式题目:就是在数组中要对通过一些判断来对数组里的内容进行处理,然后更换成新的内容,如果使用数组会很麻烦。这个时候就需要用栈,因为它更灵活,可以在往里面加内容的同时对栈内元素实现实时的修改。思路很简单,那么就看一下注意点:在发现是操作符时,注意时num2 操作符 num1因为栈的特殊原因我们所获取到的第一个num1是最后才加进来的元素。我们来看看思路:首先遍历字符串,如果是数字就加入到栈中,如果是+-*/就使用对应的操作。返回一个表示表达式值的整数。知道题目意思后就开始做题。
2024-05-01 15:31:21 273
原创 acm式 刷题(纯记录无知识点)
给出一串正整数数列以及一个正整数 𝐶C,要求计算出所有满足 𝐴−𝐵=𝐶A−B=C 的数对的个数(不同位置的数字一样的数对算不同的数对)。一行,表示该串正整数中包含的满足 𝐴−𝐵=𝐶A−B=C 的数对的个数。思路:通过unordered_map<int, int> muMap;然后通过另一个for循环查找(前提是不是元素本身)第二行,𝑁N 个正整数,作为要求处理的那串数。第一行,两个正整数 𝑁,𝐶N,C。通过for循环往哈希表里面加入元素。
2024-04-29 21:12:01 171
原创 栈 删除字符串中所有的重复数字
在完成所有重复项删除操作后返回最终的字符串。在 S 上反复执行重复项删除操作,直到无法继续删除。思路:首先判断是否和指向字符是否和栈的top相等。会选择两个相邻且相同的字母,并删除它们。然后把字符串通过函数reverse一下。如果不相等那么就把字符加入到栈中。如果相等把栈的top给pop掉。给出由小写字母组成的字符串。创建一个result字符串。把栈中元素全部加入进去。
2024-04-29 17:30:15 142
原创 栈的应用 有效的括号
然后如果是判断到 栈为空,或者top不对应栈里的内容那么就return false。然后退出循环后判断是否为空,如果空返回true 否则返回flase。首先如果是 ( [ { 那么就把对应的右括号放进去。直接写思路:因为在这个连续的括号段内,对应都从中间开始的,我们可以把左括号填入栈,当全部填完后通过top来判断。最后else就代表对应上了,那就把最上面的pop掉。(这里就体现了栈的作用:最后进入的反而是top),判断字符串是否有效。
2024-04-29 17:06:21 159
原创 利用队列实现栈
在while中将que1中的除了最后一个以外的所有元素放到que2中。查找最前面的元素(最早添加的):que1.front();查找最尾部的元素(最后添加的):que1.back();然后把que2清空(通过while .enpty)首先是创建队列:queue<int> que1;判断是否为空: que1.empty();添加元素到最后:que1.push();然后返回que1的最后一个元素。再把que1最后一个元素pop了。很简单看代码:就pop比较难。下面会讲到pop的思路。首先获取大小size。
2024-04-28 23:38:23 263
原创 数据结构 栈实现队列
然后了解栈的创建:stack<int> jinzihao;操作:stout.push(stin.top());表示把in最上面的数导入stout中。注意要返回并且移除,如果我们直接使用pop只能删除stin中的最后进入的元素。队列应当支持一般队列支持的所有操作(一:pop前函数里面没有内容(需要把stin的内容转移到stout中)二:首先找到stout.top() 并且保存到变量中。这个函数的实现就需要用到我们刚刚写的pop函数,直接使用push将x值放入stin的栈中。将元素 x 推到队列的末尾。
2024-04-28 23:11:17 814
原创 字符串 之 反转字符串中的单词
解释: 输入字符串可以在前面或者后面包含多余的空格,但是反转后的字符不能包括。思路:这题有一个难点就是空格问题只允许单词之间有空格,并且只能含有一个空格。在里面写一个如果slow不等于0 就在后面加上一个 ‘ ’给定一个字符串,逐个翻转字符串中的每个单词。输入: " hello world!输入: "the sky is blue"输出: "blue is sky the"如果遇到空格就往后移动一个位置(不看空格)然后while如果是字母就。所以需要去除空格这里使用的双指针的思想。输出: "world!
2024-04-25 23:18:00 179
原创 字符串 替换number
给定一个字符串 s,它包含小写字母和数字字符,请编写一个函数,将字符串中的字母字符保持不变,而将每个数字字符替换为number。如果oldnumber指向的元素是数字:那么newnumber往前走6步,并且分别将number赋值给对应的位置。如果oldnumber指向的是字母:那么newnumber指向的元素等于oldnumber指向的元素。oldnumber指向的是原有的最后一个位置,newnumber指向的更改后的最后一个位置。定义一个变量 newnumber 和原有的变量oldnumber。
2024-04-25 21:47:32 265 1
原创 函数swap 和函数reverse 以及vector创建数组
这行代码的含义是,初始化一个临时的一维数组,然后把这个初始化好的一维数组,添加到二维数组中。reverse 转换数组的顺序 例:由qwertyuiop转换为poiuytrewq。可以先创建一个一维数组,然后往一维数组添加元素,最后把一维数组添加到二维数组当中。可以使用.begin() 和 .end()函数。二维数组 : vector<vector<int>> array;特点:使用的是动态创建,可以不用开始设定好数组大小。参数1:需要转换的数组开始的位置1。参数2:需要转换的数组结束位置2。
2024-04-24 18:35:17 180
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人