自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(25)
  • 收藏
  • 关注

原创 C & C++ 中int和long long的最大值与最小值

对于有符号整形变量int来说,第一个bit位为符号位,0表示整数,1表示负数,后面的31位,正数用原码表示,最大值为。负数用补码表示,特别的,为了避免同时出现正0和负0的情况,如果是0x80000000,规定为。对于unsigned无符号整型变量来说,最小值即为0,最大值即为0xffffffff,即。int和long类型变量占用字节数与编译器有关,一般默认占用4个字节,即32个bit。也就是说,负整数的范围与非负整数的范围相等,即负整数比正整数的范围大1。无符号长整型最小值为0,最大值为。

2024-08-19 13:49:09 1077

原创 【动态规划 - 最大子段和】环形子数组的最大和(Kadane算法+逆向思维)LEETCODE 918

考虑出现一个最小子数组等于整个数组之和的情况,如果它的左右不全为0,则左右数组之和为一正一负,最小子数组加上和为负的数组,数组和更小,与最小子数组矛盾,如果它的左右全为0,那么表示最大子数组和是0的情况可以取到,但这种情况已经在算最大子数组时包含到了,所以排除掉也无所谓。这里可以用逆向思维来思考,如果最大子数组在头尾相接的数组中,那么就相当于从整个数组中“挖”掉了中间的最小子数组(不包含头尾元素),即最大子数组和转化为整个数组的和减去最小子数组和。给一个环形的整数数组,求解最大的非空子数组和。

2024-08-14 20:38:57 415

原创 WSL 访问Windows端的MongoDB

之后那个(首选)ipv4地址就是在WSL系统中连接windows的地址,可以telnet测试一下连通性。

2024-07-09 12:59:11 266

原创 Git 子模块功能的使用

今天遇到了一个使用子模块的场景,记录一下基本的使用方法。

2024-07-04 16:34:42 246

原创 【每日一题 231106】最大单词长度乘积(位运算 哈希表)LEETCODE 318

还可以使用哈希表优化,考虑单词meet和met,两者的占用字母状态是一致的,所以在后续统计答案时,只需要考虑meet即可,因为其长度更大。所以可以使用哈希表统计,相同状态下只保留长度更大的单词。如果学过状态压缩DP的话,应该不难想到利用位运算去存储某个单词占用的字母情况,这样一来,记两个单词占用的字母状态为int类型的a和b,只要a&b等于0即表示两者没有重复的单词。给n个单词,只由小写字母构成,要找出两个单词,满足这两个单词没有重复的字母,要最大化这样的两个单词长度的乘积。

2023-11-06 12:10:49 111

原创 【力扣每日一题 231101】LEETCODE 2127. 参加会议的最多员工数(基环内向树 拓扑排序)

,那么这是个百搭的方案,有与其中任何一个结点相连的链都可以加进来(但是一个结点只能算一条链,即与之相连的最长链),并且如果有其他的大小为2的环也可以进行组合,都相加统计进答案里。方案二:算出以每个结点为终点的最长的链的大小,用拓扑排序去求,只需要略微修改拓扑排序的代码即可,更新最长的链的大小。然后遍历找出在 大小为2的环 中的结点,将前面算得的最长的链的大小求和。方案一:根据边的指向进行遍历,如果遇到指向的点和之前已经遍历的点重复,即找到了环,算出环的长度即可,最后取最大值找出最长的环的大小。

2023-11-03 20:58:27 127

原创 【力扣每日一题 0819】LEETCODE 2235. 两整数相加(位运算)

其实,当前bit位的结果就是异或(⊕)操作,而进位就是按位与(&)操作。可以先不考虑进位,把两个加数异或,再把进位的结果集中保存下来(因为是进位,所以按位与之后需要左移1位),当作另一个加数,然后重复这一过程,直到进位为0,得到的即为结果。如果直接加法的话,毫无难度,但是我们可以尝试一种新的做法:不用加号实现相加,即利用二进制的位运算去实现这一目的。考虑两个数二进制逐位相加,那么不难发现:对于每个bit位,需要考虑三个0/1相加,即第一个数、第二个数、进位。力扣 每日一题 两整数相加 2235 位运算。

2023-08-19 14:43:25 198

原创 【力扣每日一题 0818】LEETCODE 1388. 3n块披萨(思维 动态规划 反悔贪心)

再考虑下环形的情况,首尾元素至多只能选择一个,所以先排除尾部元素跑一遍,再排除首部元素跑一遍,两者再取最大值即可。法二(后悔贪心):待补充,大概的做法是考虑每次选取元素后,考虑相邻的两者,再加入原来的环中,进行“后悔”考虑即可。个数字,但是每次选择一个数字则会抛弃掉它相邻的两个数字,问最后选定的。这道题的关键难点在于转化题意,要看出其实就是在环中选。的第一维或者第二维进行循环压缩成常数级别,空间复杂度。可以用循环数组的方式优化下空间复杂度,把。个不相邻的数字组成的和的最大值。个数字的环,现在要选择。

2023-08-18 19:30:50 128 1

原创 【Proteus 仿真课程设计】基于51单片机的测距系统仿真设计

利用Proteus软件进行仿真设计,基于51单片机设计一个测距系统,可以通过超声波测距传感器结合温度传感器计算距离并通过LCD显示屏显示、串口发送数据,并可以通过手动按键设置距离阈值,当检测到距离低于阈值时,用蜂鸣器和LED闪烁进行声光报警,当距离低于阈值一半时 ,加快报警频率。Proteus;51单片机;电子仿真。

2023-08-16 16:10:36 2202 9

原创 【链表系列 - 8】【力扣每日一题 0812】LEETCODE 23. 合并K个升序链表

法三:利用优先队列,把每个有序列表的未合并的头节点加入到优先队列,每次优先队列弹出最小的元素即可。力扣 每日一题 合并K个升序链表 23 模拟 归并 优先队列。法二:考虑分治的思想,采用归并的方式进行合并,所以共需合并。remove_if搭配erase清除空的指针元素。法一:最朴素的想法,直接两两合并,时间复杂度。给k个升序链表,要求将他们合并。优先队列的自动推导类型和初始化。③ new和delete。

2023-08-12 10:43:31 106 1

原创 【力扣每日一题 0810】LEETCODE 1289. 下降路径最小和II(动态规划)

然后可以发现,其实只需维护一下每一行的最小值和次小值,以及最小值的列数即可,因为如果当前行选的数,列数与上一行最小值的列数不同,则直接加最小值即可,若列数相同,加次小值即可,如此便把时间复杂度优化到了。的网格,每个格中有一个数,要求从每一行中选一个数,相邻行之间选的数的列数不能相同,然后把这些数加起来,找出满足条件的最小的和。注意下可以循环维护上一行的最小值、次小值,可以节约空间,另外,对。,逐行扫描之后找上一行的最小值,若列数一致则找其次小值。的情况下的满足条件的最小值,表示上一行的最小值的列数,

2023-08-10 10:32:36 104 1

原创 【力扣每日一题 0808】LEETCODE 1749. 任意子数组和的绝对值的最大值(DP 前缀和)

③ reduce函数:也可以用reduce函数来计算最值,用法:reduce(a.cbegin(), a.cend(), 0, ::fmax),其中第3个参数是初值,第4个参数是操作函数。考虑用前缀和去找出子数组和的最值,不难发现:只需找出前缀和数组中的最大值减去最小值(需要与0比较),即为最终的答案。分析一下题意,不难发现:所谓的和的绝对值的最大值,就是要找出和的最大值、和的最小值,再取两者的绝对值的最大值即可。由分析可知,就是找出子数组的和的最大值或者最小值,两者再取绝对值更大的那个值即可。

2023-08-08 16:21:06 91

原创 【魔术数字 Magic Number】神奇的平方根倒数快速估算法

我们把一些出现在代码中的不明所以却又发挥重要作用的数字称作魔术数字(Magic Number)。这通常是因为程序员不加注释造成的后果,数字的意义只有本人清楚(更准确地说,可能只有本人在写代码的时候还记得清楚)。我们不妨学习一下费马先生,解释一句:我已经想到一个绝妙的数字用来解决这个问题,但这里的地方太小,写不下完整的注释。而在算法界流传着一个著名的魔术数字案例:用来快速估算平方根倒数的0x5f3759df,第一个提出这种算法的神人真的可以为自己辩驳一句:真的不是几句注释能解释得明白的呀。

2023-08-07 15:42:31 1917 1

原创 【链表系列 - 7】【力扣每日一题 0806】LEETCODE 24. 两两交换链表中的节点(迭代 递归)

② 递归法:当没有节点或者只剩下一个节点时,直接返回,否则交换前两个链表的节点,后面的递归处理,再把next赋值即可。① 模拟/迭代/双指针:模拟交换位置的过程,这种写法较为复杂,需要注意一下细节问题;很常规的题,和8月5号的每日一题的做法几乎一致。力扣 每日一题 两两交换链表中的节点 24 递归 模拟 双指针。给一个链表,交换位置1和2、3和4、5和6。

2023-08-06 09:36:38 51 1

原创 【链表系列 - 6】【力扣每日一题 0805】LEETCODE 21. 合并两个有序链表 (迭代 递归)

另一种是递归法,写法很简洁,分情况处理,若某个链表指针为空,则直接返回另一个链表指针,否则针对两者的值的大小,修改next连接一下,递归调用,最终返回合并后的链表的头节点的指针。一种是迭代法,用两个指针分别处理,判断两个值谁大谁小,依次往后移,最后把剩下的没有处理完的链表放到末尾。给两个非严格升序链表,要求合并后依然是非严格升序。力扣 每日一题 合并两个有序链表 21 递归 迭代。

2023-08-05 10:07:31 37 1

原创 【力扣每日一题 0804】LEETCODE 980. 不同路径III (记忆化搜索 状态压缩)

改进的做法是,观察到本题的二维网格大小很小,可以状态压缩。状态由两部分组成,一部分为目前已经过的点,另一部分为当前点在哪个坐标。然后根据状态的值记忆化搜索即可。二维网格,一个起点一个终点,若干个障碍点,其余为空点,要求给出从起点到终点的所有不经过障碍点、不经过重复点、经过所有空点的路径总数。常规的做法是DFS,上下左右四个方向,回溯是否重复访问,并且记录一下经过的空点总数,最后判断一下是否可以计入答案。由于本题的重复的情况并不多,所以改进版做法的实际用时可能更长,但是有必要学习一下状态压缩的写法。

2023-08-04 17:01:54 44 1

原创 【力扣每日一题 0803】LEETCODE 722. 删除注释 (模拟 正则表达式)

现在给这样一个数组,要求去除其中的C++风格的注释(只有单行注释"//“和多行注释”/**/",尤其需要注意多行注释的换行符的去除问题)。首先,正则式的写法在本题中应该采用非贪婪模式,然后先将数组转成一个字符串(注意添加换行符来分割),然后正则替换,再重新分割,注意去除空字符串。): 非捕获分组,表示这个分组仅用于组织正则表达式的结构,而不会捕获匹配的文本,不会分配额外的内存去存储,一定程度上性能更优。

2023-08-03 11:56:47 117

原创 【力扣每日一题 0802】LEETCODE 822. 翻转卡片游戏

分析一下题意不难发现,如果某张牌正反面数字相同,那么这个数一定不行,否则正反面的数字都有可能,因为排除掉正反面数字相同的牌后,如果其他牌即使出现了某个数,由于正反面不同,翻转一下就可以避开重复了。题意概述:每张牌正反面各有一个数,现在给若干张牌,可以任意翻转卡牌(所以可以理解为不区分正反面),要求找出一个背面的数和所有卡牌正面的数字都不相同,输出满足这一条件的最小的数,不能的话输出0。所以只需要对正反面相同的牌做个特殊处理,标记出不可能的数字。正反面不同的数字先记录下来,再找出其中的满足条件的最小值即可。

2023-08-02 11:10:08 142

原创 【链表系列 - 5】重排链表

较好的做法是,注意到重组的规则即为把后半部分节点反转后,与前半部分的节点进行合并。这样的话,先找出中间节点,反转链表后半部分,再与前半部分链表合并即可。大致题意就是把链表按如下规则重组:第1个,倒数第1个,第2个,倒数第2个。朴素做法就是转成线性表,按下标重组。代码实现利用了前置两个例题的函数。

2023-08-01 21:11:09 488 1

原创 【链表系列 - 4】反转链表

② 递归法:考虑把当前节点后面的链表都递归处理,这样得到的后面的节点都已经反转了,再把当前节点反转即可。① 双指针:朴素的想法,遍历的时候同时记录和处理一下每个节点的next,反转即可。顾名思义,把链表反转过来。链表反转 双指针 递归。

2023-08-01 20:38:29 134 1

原创 【链表系列 - 3】链表的中间节点(快慢指针)

朴素算法就不赘述了,依然是采用快慢指针的方法。从头出发,当快指针达到末端时,此时慢指针的位置即在中间位置,需要对偶数个节点的链表的情况特殊处理一下。找出链表的中间位置的节点,如果链表节点为偶数个,返回中间的两个节点中的后一个节点。链表中间节点 快慢指针。

2023-08-01 19:29:52 84 1

原创 【力扣每日一题 0801】LEETCODE 2681. 英雄的力量

简单来说,就是定义力量值为若干个整数中最大值的平方乘以最小值,然后给一个整数数组,要求算出其中所有的非空组合的力量值的和,结果需要取模。然后不难发现与顺序无关,所以按从小到大排序后,以每个数作为组合中的最大值的贡献入手,只需要求出小于等于当前数的数字中,所有。当前数的组合的最小值之和,再乘以当前数的平方,即为贡献,最后将各个贡献相加即可求得答案。需要注意一下,写法上的细节问题,如位运算、滚动数组、取模等,参照代码实现。的话,考虑一下非空组合的问题,结果应为。个数的组合的最小值之和,这通过。

2023-08-01 12:17:14 64 1

原创 【链表系列 - 2】环形链表 找出入环节点 (快慢指针)

假设快慢指针同时从左端头节点处出发,步长分别为1和2,若链表有环,那么两者必定在环中某处再次相遇。如上图所示(顺序为从左到右,环中为顺时针),快慢指针在y、z交界处相遇,那么不难分析出,慢指针走过的路程长度为。即为环的长度,所以如果在相遇位置处放一个指针,在头节点处放一个指针,两者都以步长为1往后递进,那么相遇处即为要找的环的入口节点。类似地,一种显然的做法是遍历一遍保存各个节点,每次查询是否该节点已经访问过,这种做法的空间复杂度是。,快指针可能在环中绕过了若干圈,走过的路程长度为。

2023-08-01 10:38:01 162

原创 【链表系列 - 1】判断环形链表(快慢指针)

用快慢指针法,两个指针一开始都从头节点开始,依次以步长为1和步长为2向后移动,由于快指针的移动速度更快,所以如果链表有环,快指针将再次追上慢指针,即可判断出有环。也可以开始时慢指针在头节点,快指针在第二个节点,然后依次移动,追上时即可判断出有环。这两种做法前者可以用do-while语句,后者用while语句。一个显然的做法是从头开始往后扫,同时保存已经扫描到的节点,并且判断当前节点是否已经出现过,从而判断是否存在环。写法上注意一下判断空指针 nullptr 即可。给定一个链表,要求判断有没有环。

2023-08-01 01:10:18 205 1

原创 Knuth-Shuffle 洗牌算法

关键在于保证等概率,Knuth-Shuffle算法的做法是:从第1个位置开始依次到最后,随机从该位置元素到最后一个位置元素中随机等概率抽一个,把抽中的元素交换到该位置。洗牌算法,简单来说就是给定若干个元素,每次执行洗牌算法之后要基本等概率地给出这些元素的排列,即字面意思上的洗牌。给一个整数数组 nums ,设计算法来打乱一个没有重复元素的数组。打乱后,数组的所有排列应该是 等可能的。满足等概率性,且由于每次抽取元素后采取的行为是交换,所以不会重复。个元素,每个元素出现在第1个位置的概率是。

2023-07-31 11:48:20 261 2

空空如也

空空如也

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

TA关注的人

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