- 博客(58)
- 收藏
- 关注
原创 Leetcode 岛屿问题 200, 1905, 694重新做,其他的想思路
这里把岛屿淹类似于维护了visited, 确保不会重复计算岛屿,dfs的作用是把一整块岛屿都淹没了,当遍历到岛屿的其中一块时, 会向外淹没,直到这个岛屿都被淹没。和上一题很像,这里就不需要把中间的岛屿淹没了,只要求1的数量就可以了。需要用一个set记录岛屿的形状。重要的是想到是什么是子岛屿。去除掉四边的岛屿就可以。这里也要记录撤销的值。
2023-10-10 00:30:28
153
原创 Leetcod graph(new topic)
如果不是acyclic(无环), 要用另外一个vector 记录走过的节点,防止进入死循环。1.首先要排除,因为条件,所以至多有一个名人,那么两两对比,选出唯一的可能是名人的那个人。3.最后剩下的那一个也不一定是名人,要在判断。这里用的是后序,所以之后要reverse一下。需要一个单独的vector记录。1.首先要建一个graph表。这里的s是记录正在走的节点。2.对比的结果有四种。2.遍历判断是否有环。
2023-09-29 05:15:58
214
原创 Leetcode
这里要改变链表就要写pre->next = head->next。注意如何判断是不是连续数第一个数字。要记得回溯的时候depth-1。这道题要注意的就是要写虚拟表头。
2023-09-26 00:40:17
593
原创 Leetcode (OK)242 1 219 (思路)383 202 (*)205 290 49
2.要先判断两个大小是否一样。1.注意如何存储单词。也可以直接用sort。
2023-09-22 09:56:30
107
原创 Leetcode (ok)167 11 (思路) 35 74 (*) 162 33 34 153
当right = nums.size(), 表示为左闭右开,此时终止循环时,left = right。先确定断崖和mid的关系, 在找有序的部分。最重要的还是如何取区间。把二维的转换成一维的。
2023-09-15 00:46:10
153
原创 Leetcode 392(会) 20注意细节 * 12 151 6 71
2)每个单词进行翻转的时候,不要忘了判断最后一个词,因为最后一个词的后面没有空格,所以要加一个条件i==newString.size()这里的a要是isstream,所以要加一步stringstream ss(path)1.除了每组第一个数(如A, I),其余每一行都会有两个这一组的数(如B和H)1)在写reverse函数的时候,要写string& s, 不要把&忘掉。因为这里涉及到“..”, 所以正确的是stk存储的是string。有基本思路:把每一组‘z'看成一个组,依次读取(像‘A-H’)
2023-09-14 05:05:59
92
原创 leetcode 42, 58, 14(*)
因为其实只要一边找到最大值了,无论另一边是不是最大值,只要比它大,那么一定能兜住他。某一竖条的储水量怎么求?他的高度是左边最大 和 右边最大 取的最小值,然后再减去自身的高度。这里的l_max是【0, left】的最大值,r_max是【right, n-1】的最大值。这里就是把每一次的最大最小值都记录下来,就不用每次都遍历了,跟上一个思想没有区别。这里用到sort, sort的最前和最后是最不相关的两个string。因为最后也有可能有空格,所以从后面开始。1.暴力解法(未通过)
2023-09-13 21:45:05
83
原创 Leetcode122,55可以只想思路, (*)45 274 135
可以想象成山峰山谷,当上升时(ratings[i] > ratings[i-1]), 那么这个人就要比前一个人多拿一个,下降时,前一个人要比后面的多拿一个(如果只看计算,那么就可以想象成+1即可),这样算完后会有一个问题就是, 每一个山峰会多算一次(peak和valley各算了一次), 为了两边都满足,peak要取两边的最大值,也就是说在计算上,要减去小的值。这道题因为要考虑左右两边,所以要从左到右遍历一次,也要从右到左遍历一次。这道题的关键是想到,要用一个数字来记录选择的跳跃步数。
2023-09-12 22:08:01
319
原创 Leetcode
这里我有一个地方想错了,重复的两个未必是两端,这样的话,就要把重复之前的全部都删掉,所以缩小窗口的时候,不能是map[s[right]]-- (只删掉重复的,而是s[left], 这样就能把重复之前的数字全部都删掉)
2023-09-09 00:23:32
210
原创 Leetcode array 704 27 189 121 380 238 134 13
二分搜索:判断条件是left 和 right这里就要注意区间开闭的问题。
2023-09-06 01:07:14
374
原创 Leetcode 二叉树 501 236 235 701 450
用unordered_map(不是搜索二叉树也可以用)这道题要从最下面开始找,当p,q分别在左右两端的时候证明此时就为公共祖先。
2023-08-18 22:38:48
157
1
原创 Leetcode 二叉树 111 222 110 257 404 513 112 113
1.分解思想2.也可以用层序这里是完全二叉树,所以跟普通的求法不同。
2023-08-16 03:30:34
181
原创 Leetcode 动态规划
这里的增的功能用另一个删来代替1.dp[i][j]这里要设置为在范围[i,j]范围内是否是回文串2.范围,因为这里依赖于dp[i+1][j-1]所以一个从大到小,一个从小到大(完全看答案的,之后要重新写)1.初始化问题:因为我们设定的是j=i+1, 所以会算不到i=j的时候,所以要初始化为12.当不等的时候,要分别看加进来i,j的情况,而不是直接dp[i][j] = dp[i-1][j-1]
2023-08-15 21:51:17
175
原创 Leetcode 子序列 53 392 115 583
1.双指针2.动态规划初始化:这里感觉对我来说有点难以理解dp[i][0] 这里我的理解是,以下标i-1位结尾的s和空集能够相同的子序列的个数,那么肯定只有一个,就是把s里的全部删掉dp[0][j]s是空数组所以不可能和t一样(除了t是空数组的时候,所以dp[0][0]为1)注意:这里不能直接用int会报错。
2023-08-14 22:10:37
144
原创 Leetcode 动态规划 打家劫舍 337 股票 121 122 123 188 子序列 300 674 718 1143 1035
因为这里最长子序列不一定在最后,所以要重新设一个值记录最长子序列。dp[i] 表示下标为i的数字(包括)的前面的最长子序列的长度。初始化的时候所有的值的初始值都应该是1。
2023-08-10 00:38:56
199
原创 Leetcode动态规划 474 518(背包总结) 377 70 322 279 139 198 213
j++){1.组合数的递推公式2.注意组合数和排列数组合数,对顺序没有要求,即1,2和2,1只算一次,此时,只能先遍历物品,再遍历背包排列数,先遍历背包,再遍历物品3.完全背包和01背包完全背包:每个物品可以重复用,一维数组遍历背包的时候从小开始01背包:每个物品只能用一次,一维数组遍历时从大到小public:dp[0] = 1;i
2023-08-09 21:43:34
227
原创 Leetcode 动态规划 62 63 343 96 416 1049 494
最重要的一点明确dp[i][j] 是什么意思注意:1.注意特殊的情况开头和结尾是1的2.在设置初始值的时候,如果其中一个为1,那么后面的就都是0了可以在上面代码的基础上在做一点改进这样写更简洁一点1.这里的dp[i] 指的是 整数i拆分出来的最大乘积2.一开始没有想清楚递推公式从左右子树出发开始找规律。
2023-08-08 22:23:39
103
原创 Leetcode 队和栈列 20 1047 150 239 347
有两种特殊情况,第一种,一出现就是右括号(代码中的体现是判断的时候要写stk.empty(), 不能只写不等)第二种是左括号多出来了(代码体现在最后return stk.empty)
2023-08-07 21:29:32
29
原创 Leetcode 136 2// 动态规划打家劫舍 198 213 337 // 18// 字符串 344 541
1.位操作,用异或2.使用map(使用了不恒定的额外空间)3.排序后看前后两个元素是否一样,使用了恒定的额外空间。
2023-07-22 03:57:39
33
原创 Leetcode 动态规划 139 // 11 43
3.明确什么时候是数字,什么时候是char,char/int互换要 +-‘0’2.一定要明确数组的哪一端是个位数,哪一端是大的,这里个位数是数组最大编码的值。这样比较好判断0,在数组前面的0是不需要进入string结果的。1.不能直接相乘,会溢出,要模拟每位数相乘的步骤。5.模拟每一步的时候,要记得加上之前的值。4.最后还要判断特殊结果,即结果为0。
2023-07-21 22:06:41
49
原创 Leetcode 动态规划70 322 279 哈希表 454 383 15
组合数,不在意顺序(比如(1,2)和(2,1)是同一组)所以先遍历物品,在遍历背包。1.为了求得是最小值,dp数组初始化应为INT_MAX,dp[0] = 0。因为一种和肯能会出现多次,所以要用map-val记录出现的次数。排列数,在意顺序(不同顺序的算新一组),所以先背包,在物品。2.else里面要用while,因为有可能一直重复。2.要加上条件if 不等于最大值以及-1的情况。3.明确排列数和组合数的区别。1.先遍历物品,在遍历背包。2.先遍历背包,在遍历物品。
2023-07-20 23:20:58
57
原创 Leetcode 动态规划 474 518 377 哈希表 242 349 202 1
如果求排列数就是外层for遍历背包,内层for循环遍历物品。1.如果题目中给了范围,就可以用数组(因为set要占用的空间更大)1. 如果求组合数就是外层for循环遍历物品,内层for遍历背包。2. 要加上限制条件防止runtime error。2.可以把res也改成set这样就不用删除了。这个是因为测试用例有想加大于4个字节的存在。装满背包一般用到公式。
2023-07-19 03:54:54
29
原创 Leetcode 动态规划62 63 343 链表 86 206 92
1.确定dp数组的下标及定义dp[i][j]从(0,0)到(i,j)的不同路径数量2.确定递推公式3.初始化dp[i][0]和dp[0][j]都是1;4.遍历顺序,从左上到右下。
2023-07-17 22:37:53
34
原创 Leetcode链表 24 19 160 142 141 21
注意:1.return dummy->next而不是head;2.最好把post放到循环里面,不然可能会出界。
2023-07-14 21:48:07
33
原创 Leetcode 链表 203 707 206 动态规划 509
因为如果不写,当遇到n=1的时候会运行dp[2],但是vector是没有dp[2]的,就会出现错误。不要忘记增加节点和删除节点的时候size也要变化。要稍微注意一下最后返回的是哪个值。为什么要写第一句n<=1?
2023-07-13 23:45:16
26
原创 Leetcode数组 977 344 5 209 3 438
双指针注意一个问题出现的情况在函数中该返回string的地方返回了int。尤其注意是不是return "0"写成了return 0这道题需要给res设置初始值。
2023-07-12 04:25:13
42
原创 Leetcode数组 二分查找 双指针 704 34 35 27 167 26 283
可以用二分法的两个条件:1.数组是有序的2.数组是不重复的注意区间:当right = nums.size()-1;就意味着这时一个左闭右闭的区间,相应的 循环条件为 left <= right,left和right的取值也为mid+1 和mid-1。
2023-07-11 02:11:37
31
原创 Leetcode 455 376 53 122 55 45 988 1022
若参与比较的两个串值相同,则函数返回 0;若字符串 S 按字典顺序要先于 S2,则返回负值;两个代码的区别是,一个是遇到更大的就计数,一个是这一步走完再计数走到这区间中的另一个最大值。想到了负数对连续和的影响,但是有影响的是连续和为负数而不是遇到负数就返回。因为每天只能买入一支股票,所以它就是每天正向利润的总和。2.逐字符比较,从前往后,比较出结果后就结束。string.compare的用法。(也可以用动态规划,之后在写)先加还是判断,还是先判断再加。1.比较的是字典顺序。
2023-06-27 01:00:07
35
原创 Leetcode 回溯 491 46 47 199 298
这道题容易想到用used[],但是这时不可以的,因为input的nums是没有顺序的,而且也不能排序于是可以想到要检查每一层是否选过相同的数(for循环是横向(层),迭代是纵向)1.这里不需要return,因为记录了之后还要接着看后面的值2.unorder_set的位置这里在for循环前面意味着,在迭代到下一层的时候会建立一个新的set,所以set记录的是每一层使用的值同样的,迭代后是不需要删掉set最后一个元素3.unordered_set一些用法。
2023-06-23 22:32:40
30
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人