刷题day4
发表于
|浏览量:
插入区间
一眼left right二分+合并区间。然后这个合并区间是只有三个区间。然后我就懒得写区间合并,然后就悲剧了
真神了,为什么要模拟,真的是神了,思路出来0s,模拟1h还不对。真不如区间合并板子用一下。就算我过了,不想改了
文章作者: wellorbetter
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 wellorbetter's blog!
相关推荐

2026-06-03
刷题day9 补充
最长公共子序列 一个字符串的 子序列 是指这样一个新的字符串:它是由原字符串在不改变字符的相对顺序的情况下删除某些字符(也可以不删除任何字符)后组成的新字符串。 例如,”ace” 是 “abcde” 的子序列,但 “aec” 不是 “abcde” 的子序列。两个字符串的 公共子序列 是这两个字符串所共同拥有的子序列。 咋说呢,这个题没做出来,我的思路是直接暴力枚举,1 << 1000 直接炸了这个dp[i][j] i和j表示俩字符串的最后一位,用闫氏dp法,切割最后一位状态,它这俩字符串这个ij位到底可能有哪些情况比较好想出来的就是字符串是否相等来切割,如果相等,那就直接等于i-1 j-1 + 1,如果不相等,就等于i-1/j-1 取max个人感觉不是很好想出来,看答案了 class Solution {public: int dp[1020][1020]; int longestCommonSubsequence(string text1, string text2) { for (int i = 1; i <...

2026-06-07
刷题
LRU大概思路就是unordered_map hash+双向链表head,tail拿的时候hahsmap key int value node我能直接get拿到这个node,然后把这个node 先remove,然后插到链表头部put的时候,也是,如果有,就修改这个value,然后remove,再insert如果没有,new一个node,然后再看size和cap的关系,如果大于等于,就要先remove这个tail的一个,然后再insert头 class LRUCache {private: int cap; struct Node { int key, value; struct Node* prev; struct Node* next; Node(int key, int value): key(key), value(value) { } }; struct Node* head; struct Node* tail; unordered_map<int, Node*> m...

2026-06-03
刷题day9
无重复字符的最长子串给定一个字符串 s ,请你找出其中不含有重复字符的 最长 子串 的长度。 最开始写成模拟了,后来想了一下,这个是滑动队列,很久之前写过,写不太懂了大概就记得维护一个l到r的一个队列,大概就是进来先放当前的这个i这个值如果重复了,那就弹队头,l++然后每次进来先放,然后r++没啥问题 class Solution {public: map<char, int> mp; int lengthOfLongestSubstring(string s) { if (s.size() == 0) return 0; int l = 0, r = 0, res = 1; mp[s[l]] ++; for (int i = 1; i < s.size(); i ++ ) { mp[s[i]] ++ ; r ++ ; // cout << i <&l...

2026-04-21
刷题day2
移除元素给你一个数组 nums 和一个值 val,你需要 原地 移除所有数值等于 val 的元素。元素的顺序可能发生改变。然后返回 nums 中与 val 不同的元素的数量。 假设 nums 中不等于 val 的元素数量为 k,要通过此题,您需要执行以下操作: 更改 nums 数组,使 nums 的前 k 个元素包含不等于 val 的元素。nums 的其余元素和 nums 的大小并不重要。返回 k。 题意大概意思就是给你一个数组,一个值,返回这个数组去除这个值的顺序数组 解法暴力遍历最简单 然后优化应该就是双指针了。就这样吧,你可以新开一个数组,然后顺序走++,因为你每次++都一定会填入一个你需要的数值然后这个数值的得到是通过原始num数组和val是否相等来的,这个也是顺序++判断的 题解还有个解法没仔细看,叫对撞指针?看不明白就这样吧

2026-05-24
刷题day8
岛屿数量已解答中等相关标签premium lock icon相关企业给你一个由 ‘1’(陆地)和 ‘0’(水)组成的的二维网格,请你计算网格中岛屿的数量。 岛屿总是被水包围,并且每座岛屿只能由水平方向和/或竖直方向上相邻的陆地连接形成。 此外,你可以假设该网格的四条边均被水包围。 咋说,比较简单,dfs秒了但是这个也能用并查集做,就差不多吧,反正遍历挨个合并就行了练一下模板吧 123456789101112131415161718const int N = 1e5 + 10;int parent[N], size[N];int find(x) { if (x != parent[x]) parent[x] = find(parent[x]); return parent[x];}int union(int a, int b) { int ra = find(a), rb = find(b); if (size[ra] < size[rb]) { int t = ra; ra = rb...

2026-05-07
刷题day5
最大正方形 个人思路,0s想出思路,二维前缀和+for nm len 遍历 n^3也能过 这里正解是dp,但是我是感觉这个dp理解起来很费解,感觉很难了。他这个dp ij表示的是边长,因为正方形面积实际上是和边长挂边的,但是边长更简单不用开根号。然后这里你表达的是最大的边长,这里来看的话,我理解你可能会由i-1 j-1 i-j&j-1这三个正方形转化而来110110001比如这个,那就是i-1&j-1011011001 这里就是i-1110110001 这里就是j-1但是实际上能走到扩大的只有111111111因为这三实际上是相互影响的。你如果i-1能扩展到i,那意味着,你这个i-1上面必须至少全部都是1,同理j-1,i-1&j-1要拓展过来,你这部分都得是1那很明显,那就是这三的最小值都得满足满1,然后才能+1那这里dpij >= min(这三个)+1那这里dp ij 能不能不止+1 能+2呢?假设这个最小值是m,然后这个如果dpij >= m+2,那这里就会存在m+2,m+2,这个正方形,它这里面能拆出三个m+1那这...

