- 博客(8)
- 收藏
- 关注
原创 力扣3-无重复字符的最长子串
如果双重循环暴力截取每一个子串(n^2),并且判断子串是否重复(n),最暴力的写法复杂度是O(n^3)。我除了把双重循环改成单层循环了,但是这样只变成了O(n^2),只能处理几万大小的数据,还是太慢了。这两者的作用差不多,但是map可以储存key和value,相比起只能储存key的set,正好满足我们的要求。不必在每次更新子串后,都从头判断当前子串是不是重复的,因为如果之前都不重复,那新加一个字符的话,只要直接查一下那个字符在不在就行了。想了想怎么实现检查重复字符的操作,于是写出了rep函数。
2024-09-02 18:26:32
449
原创 RMQ问题-st表
但是如果我们要查询的区间是[l,r],那我们可以查询max(区间[l,a],区间[b,r]),并且a一定要大于等于b,因为中间有交集的部分不影响最大值,但如果中间有断裂的地方就影响了,如果最大值刚好在断裂的区间里就会判断错误。此时左st表的下标就是st[l][k],右st表st[r-(1<<k)+1][k],分别代表了从l到l后2^k个数的区间,和从r到r前2^k个数的区间,计算两者最大值即可。总结:如果只需要查询就用st表,但是st表无法增删改,所以需要多次修改值的时候,就用线段树。
2024-08-16 02:22:37
241
原创 力扣49-字母异位词分组
来作为内层循环的条件,这个大小是针对第一个子向量的,而其他子向量可能有不同的大小。1.unorderedmap的用法:左边是key的类型右边是value类型。2.遍历不太会用auto,但是好像直接打上去就没事了。中的内容,从而提高效率。这样做的目的是为了避免复制。,同时避免了不必要的内存复制开销。因为迭代器返回的是一个pair。不用auto就得这么写了。来不及写了电脑要没电了。
2024-08-13 17:31:21
285
1
原创 力扣47-全排列 II
假如nums=1,2,2,3,那cur第一次回溯到1,2,3的时候,还有下标为2的2未使用:此时虽然nums[i]==nums[i-1],但是这个2没有填在和上一个2相同的位置上,即上一个2在当前的cur中已经被使用过了(条件num[i-1]==0时,continue)每个排列可能的长度==原数组的长度,对应每一位数字,都可以填上num[0]~num[n]中没有使用过的数字,本质上是一棵树,每个父节点都分出来n个子节点,但其中使用过的数字的节点被剪掉了。太久没写题了我复健之。
2024-08-13 16:08:09
225
原创 洛谷P1135 奇怪的电梯--dfs剪枝和bfs
如果来到此楼,但是之前已经存在花费比这更少的步数就能到达这里的情况,那说明中间肯定绕了路,不是最短路。2.可能有死循环,比如3 1 2 0 2,从3到4层,可能在3和5之间一直往返(每次到3都先进入上楼的路径)。思索了一下,发现可以加入条件:如果当前路径的步数已经超过了之前统计过的最少步数,那这肯定不是最短路,直接返回。既然没wa只有tle,自己的算法应该是没啥问题的,那就是还有没剪掉的枝。2-1-此时本来要到3,但是之前的路径里我们已经到过3,肯定绕路了。可以100分了,应该快了很多。
2024-04-11 23:25:38
925
2
原创 蓝桥杯2023省b——飞机降落(dfs)以及萌新关于dfs的思考
可以抽象成有一个数列{1,2,3},例举所有的排列顺序{123}{132}{213}{231}{312}{321}。此时的数字2,已经没有被使用过了,目前的排列顺序是{1,3,},第三层递归依旧从int i=1开始,1已经被使用,但是2没有,所以第三个数字填为2。第三层遍历已经到达数组的尽头,递归结束,返回第二层,此时for循环里的i++(原本等于2),自增为3,进入第三层递归。如何在更新路径时,把数字的标记擦掉?飞机1只能坚持两分钟,但是如果先降落一,降落过程太久,会把飞机2耗死,正确答案应该是2→1。
2024-04-11 18:17:44
890
1
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅