- 博客(37)
- 收藏
- 关注
原创 牛客:矩阵消除游戏
二进制枚举所有可能的选行方案:用二进制数表示选中的行(例如101表示选中第 1 行和第 3 行)。计算选行后的剩余可选列数:若选了num行,则还能选k - num列(需保证非负)。贪心选择最优列:对未被选中的行,计算每列的元素和,选择最大的k - num列,累加其和。记录最大值:遍历所有选行方案,保留总和最大的结果。int n,m,k;int num=0;i<=n;i++){j<=m;j++){num++;}else{j<=m;
2025-10-21 15:10:05
453
原创 牛客:NC16618排座椅
读入d对坐标x,y,p,q,如果x=p说明是横坐标相等就应该是纵向通道:zong[min(y,q)].num++;纵向通道zong[1024],横向通道heng[1024](需要先将pos初始化)如果是y=q说明是横向通道: heng[min(x,p)].num++;用一个结构体记录每一个通道的通道号pos和该通道可以隔开的人数num。然后进行排序,先按num排序降序,然后按pos排序升序。
2025-10-21 15:09:11
313
原创 牛客:机器翻译
用一个标记数组和一个缓存数组,如果vis标记数组里面没有标记,检查到了之后就标记,并且加入缓存,如果缓存满了则把最早的一个标记解除,表示把它踢出缓存。的元素(遵循 “先进先出” FIFO 规则),并取消其 “已存在” 标记;若不在窗口内:该元素是新的,加入统计,并更新 “最近元素窗口”。最终输出所有曾被有效处理(加入过缓存)的元素总数。若不在缓存:加入缓存,同时标记为 “已存在”;若在窗口内:该元素是重复的,不计数;中(即 “缓存窗口” 内);若已在缓存:不做处理,跳过;若加入后缓存容量超过。
2025-09-23 21:30:50
239
原创 牛客:多项式输出
#### 解题思路:先处理第一个系数,因为第一个系数前面的符号为+时,不用写,然后处理最后一个数,因为它是一个常数,至于中间的数都统一处理,先判断他的正负输出它的符号,然后判断他们的绝对值是否为1,如果为1就不输出系数,如果不唯一就输出绝对值,然后判断是不是倒数第二项,因为倒数第二项不用输出指数部分。##### 注意:要用一个标志位来记录,是否全为0,如果全为0就直接输出0;
2025-09-23 21:15:39
240
原创 牛客:校门外的树
这道题的核心是计算移除指定区间内的树后,剩余的树的数量。代码使用高效解决了区间覆盖问题,时间复杂度为 O (L + n),比暴力遍历更优。
2025-09-15 18:15:14
390
原创 三数之和:力扣15
思路:该解法先对 nums 数组排序,遍历过程中以 nums [i] 作为三元组的第一个元素:若 nums [i] 大于 0 则直接跳出循环(排序后后续元素更大,无法凑出和为 0);若 i>0 且 nums [i] 与 nums [i-1] 相同则跳过(去重)。
2025-09-10 19:21:17
319
原创 四数相加||:力扣454
核心思路是将四个数组分成两组,先计算前两个数组(nums1、nums2)所有元素对的和,并将和的出现次数存入哈希表 map1;再计算后两个数组(nums3、nums4)所有元素对的和,取其相反数在 map1 中查找,若存在则将对应次数累加到结果中,从而通过空间换时间,将四重循环的时间复杂度从 O (n⁴) 降至 O (n²)。
2025-09-10 16:10:39
274
原创 两数之和:力扣1
思路:先用哈希表存储数组元素与对应索引的映射,再遍历数组,对每个元素计算其与目标值的差值(互补元素),通过哈希表快速判断该差值是否存在且对应的索引不是当前元素,若满足则返回两个元素的索引。
2025-09-09 16:57:41
208
原创 两个数组的交集:力扣349
给了两个数组判断一下他们的交集,我们先把其中一个数组放到unorderd_set集合里面进行去重,然后遍历第二个数组,看元素是否在刚才的集合里面能找到,如果能找到,我们就把这个元素存到另外一个unorderd_set集合里面(保证最后结果也进行了去重)。最后把去重后的结果转化成数组返回即可。
2025-09-09 16:40:38
266
原创 有效的字母异位词:力扣242
思路:因为字符串是s,t都只有小写字母;我们定义一个26位的数组,先扫描s字符串,将对应的字母个数加一,然后扫描t字符串,将对应的字母减1;最后判断数组的每一个元素是否位0,如果为0说明是s和t是异位词。
2025-09-09 15:26:26
135
原创 环形链表:力扣142
思路1:定义一个哈希表和一个计数变量n=0,以链表节点地址作为键,以n作为值,每次新增一个节点n++(表示对应节点在第几个位置),逐个检查节点,查看当前节点是否已经存入哈希表,如果已经存入就返回对应的节点,如果没有查询到就将改节点的地址和对应的n存入哈希表。思路二:快慢指针,快指针每次向前走两个,慢指针每次向前走一个。如果他们相遇,则说明该链表有环。然后慢指针直接回到头节点位置,快指针从相遇点开始每次向前走一步,慢指针从头节点每次向前走一步,当他们再次相遇时,那个节点就是环的入口点。
2025-09-08 20:07:04
211
原创 删除链表的倒数第N个元素:力扣19
思路2:快慢指针,先让快指针移动N步,然后再同时移动到最末端(需要先在最前面加一个虚拟头指针)思路1:将链表翻转,然后删除第N个,然后再翻转一次。
2025-09-07 20:17:45
144
原创 链表翻转:力扣206
思路:定义一个pre,一个cruent;pre最开始指向nullptr,curent指向head;在翻转之前,用一个临时变量来记录curent的next,以便后续移动。注意最后返回的是pre,因为我们的while结束判断是curent!
2025-09-06 17:03:57
227
原创 设计链表:力扣707
思路:需要用使用虚拟头节点和一个size来记录链表的长度,但是虚拟头节点不记录长度。每次对链表进行添加和删除也需要对size进行加减。
2025-09-06 16:44:36
145
原创 移除链表元素:力扣203
我们每次遍历都是先检查curent->next!然后curent->next->var是否等于var,如果不等于就curent=cruent->next(这个只有在没有删除节点的时候才移动,很重要);dhead用于记录头节点head的位置,curent用于遍历后续节点。思路:先创建两个新的节点dhead和curent,如果等于就删除对应的curent->next节点。
2025-09-05 09:33:13
201
原创 螺旋矩阵:力扣59
思路:先规定怎么走,就是每一步走到什么时候停止:(横着走到本行的什么地方,竖着从什么地方走,走到什么地方停)把最后一个留给下一步进行填充走多少圈,这个很重要,走(n/2)圈, 如果n为奇数我们需要单独填充一下
2025-09-04 10:58:45
211
原创 长度最小的子数组:力扣209
思路二:双指针思想,每次计算i,j范围的sum,当sum>=target时,取最小长度,然后向前移动i(i++),每次运动前sum减去当前的num[i],直到sum<target,然后重新移动j。思路一:双层for循环暴力。只能过部分点,会超时。
2025-09-03 19:52:45
224
原创 力扣704
left,right] 左闭右闭 left<=rigth 边界处理: left = mid+ 1 right =mid-1;(left,right] 左开右闭 left<right 边界处理: left=mid;[left,right) 左闭右开 left<right 边界处理: left=mid+1 right =mid;
2025-09-01 12:26:43
202
原创 力扣LCP 07.传递信息
注意当前i层依赖 i-1 层,例如:如果循环 i 轮,能够到达 0 点,那relation里面 0 可以到达的点,第i+1轮肯定可以到达。dp[i][j] 依赖于 dp[i-1] 这一层,因为只有先经过i-1次循环到达的点,才有机会循环第 i 次。把dp数组自己手动填充一遍!然后我们初始化dp数组:注意,我们只将 0 点初始化为1,因为0点循环0次开始,只有一种方案。dp[ i ][ j ] :表示循环 i 次到达 j 点的方案数。邻接矩阵的作用,就是检查i-1层的点可以到达哪些点。
2024-12-29 20:23:23
249
原创 力扣122.买卖股票的最佳时机II
贪心思路:既然可以进行多次,且现在是为了求最大收益,所以只要可以赚钱我们就卖,并且抓住每一次可以赚钱的机会(希望各位都可以抓住机会!),即:prices[i]-prices[i-1]>0。只要大于零我们就把差值加入到我们的总收益里面即可。题目解析:本题和121题不同,本题的买卖可以最多进行n次,也就是说可以当天买当天卖(没有意义)。买卖股票最经典的思路是动态规划,但是今天我在这里也会记录利用贪心的思路求解的方法。动态规划的思路和121题基本一致。
2024-12-22 09:43:29
405
原创 力扣121买卖股票的最佳时机
每次寻找左边的最小值进行记录,然后以这个最小值作为买入点,当后面的点大于这个点时,我们就尝试着卖出,并且更新记录最大的收益;当遇上比前面选的买入点还小的点时,我们更新买入点的位置,继续遍历尝试着卖出股票,直到第n天结束。我们需要建立一个dp[n][2]的数组,dp[i][0]表示持有股票的状态,可以是当天刚买入,也可以是之前买入到第i+1天还没有卖;dp[i][1]表示不持有股票,可以是一直没有买入过股票,也可以是第i+1天刚刚卖出了。方法一:利用贪心思路求解。方法二:动态规划求解。
2024-12-21 11:02:48
299
原创 最优二叉搜索树
假如第k个节点为根节点,那么 dp[i][j]就应该为k的 左子树 dp[i][k-1]加说k的右子树dp[k+1][j]在加上i~j节点的搜索概率和sum[i][j];这里我们要找的是i~j中哪个节点为我们所说的k时dp[i][j]最小,所以我们需要遍历i~j;至于为什么最后要加sum[i][j],因为当k作为节点时,dp[i][k-1]和dp[k+1][j]的深度需要加1,并且左右子树不包括k节点的搜索概率,所以我们需要加上sum[i][j];当i>j时dp[i][j]=0;
2024-12-17 16:53:53
488
原创 力扣583.两个字符串的删除操作
当不等于时,dp[i][j]=min(dp[i-1][j]+1,min(dp[i][j-1]+1,dp[i-1][j-1]+2));想必大家通过上面的动态转移方程就已经看出,当前的dp[i][j]是需要依赖dp[i-1][j-1]和dp[i-1][j]和dp[i][j-1]的,所以我们需要对第一行和第一列进行初始化。当word1[i]==word2[j]时,dp[i][j]=dp[i-1][j-1];,或者是同时删除word1[i]和word2[j]首先:对于dp[0][0],我们需要判断。
2024-12-11 15:42:35
336
原创 力扣115.不同的子序列
对于第一行:dp[0][j]表示在s[0]结尾的字符串中以t[j]结尾的字符串个数,显然j>0时,是不存在的,所以只需要判断s[0]==t[0].后面的全部初始化为0.想必大家通过上面的动态转移方程就已经看出,当前的dp[i][j]是需要依赖dp[i-1][j-1]和dp[i-1][j]的,所以我们需要对第一行和第一列进行初始化。当s[i]==t[0]时,dp[i][0]=dp[i-1][0]+1;不等于时,dp[i][j]=dp[i-1][0];(一定要理解这句话)。最后取dp[n-1][m-1].
2024-12-11 14:59:53
416
原创 力扣392.判断子序列
1. 利用双指针遍历 s 与 t , 挨个判断s中的元素是否在 t 中存在 ,具体方法:i ,j 两个指针从0开始,如果s[j]==t[i],则i++,j++;如果不等于则只是i++;继续比较s[j]==t[i];直到 i=t.size(),跳出循环,最后判断j是否等于s.size()即可。2.动态规划思想:就是找s与t 的最长公共子串。找到最长公共子串之后,判断该长度是否与s的长度相等,若相等说明s可以在t中找到。本题需要考虑一些特殊情况,及s与t的长度大小问题。
2024-12-08 21:22:56
340
原创 力扣1143.最长公共子序列
2.动态转移方程:如果text1[i]=text2[j],则dp[i][j]=dp[i-1][j-1]+1;如果不等于,dp[i][j]取前面可以匹配上的最大值:max(dp[i-1][j],dp[i][j-1]);3.初始化:对于第一行第一列我们需要进行初始化,dp[i][0]与dp[0][j],如果不等于就取0,直到当前等于,我们取1,且后面的全取1;1.明确 dp[i][j] 的含义:表示text1中前 i 个字符与text2中前 j 个字符中可以匹配上的最长字符串长度。
2024-12-08 21:18:53
278
原创 力扣718.最长重复子数组
dp初始化,首先我们只初始化dp[i][0]和dp[0][j],当nums1[0]==nums2[i]时dp[0][i]=1,当nums1[i]==nums2[0]时dp[i][0]=1。其余的点先全部取0.首先明确:d[i][j]的意义,他表示以nums1[i]元素结尾的字符串和以nums2[j]元素结尾的字符串他们的重复子数组的最大长度。其次:当nums1[i]==nums2[j]时,dp[i][i]=dp[i-1][j-1]+1;然后开始遍历,两层for,i=1,j=1开始。
2024-12-06 15:07:42
389
原创 力扣300.最长递增子序列(动态规划)
例如:nums = [0,1,3,2] , 我们从下标为0的元素开始考虑,如果以下标为0的元素结尾,那么这个子序列的长度就为1;当我们考虑到第 i 个元素时,需要依次去检查前面0~i-1的元素中,值比nums[i]小但长度最大的那个,然后取最大值。上面的dp数组的含义是:以第 i 个元素结尾的最长子序列长度,他依靠前面的元素,取前面的nums 元素比nums[i] 小但长度最长的子序列加一。思路:每次考虑以第 i 个元素结尾时能够构成的最长子序列。注:本文只是为了记录作者在刷题过程中的一下思路和心得。
2024-12-04 19:29:38
428
1
原创 力扣2.两数相加
思路:我们从头开始遍历两个链表,当两个链表都没有到头时,我们正常将该节点的值进行相加,并且建立新的节点来保存当前位的值,加入到前面结果的结尾,同时保存进位的值;若当前任意一个链表没有到达末尾,我们应该继续运算,在运算时把已经到达末尾的链表对应位看作0(相当于高位用0补齐)。链表两数相加的问题与数组里面大数相加的问题一样。
2024-12-04 19:28:13
429
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅