
LeetCode
文章平均质量分 58
..
buptwhq
这个作者很懒,什么都没留下…
展开
-
【LeetCode】327场周赛记录
两个数组分别存下两个字符串中出现的字符个数,然后模拟交换过程,交换成功则return true,否则恢复现场。原创 2023-01-08 12:21:24 · 227 阅读 · 0 评论 -
核心代码在本地IDE调试
【代码】核心代码在本地IDE调试。原创 2022-12-24 00:19:20 · 325 阅读 · 0 评论 -
【练习题】数据离散化+二维前缀和
保证100%的数据中,点的数量n原创 2022-12-12 01:08:56 · 568 阅读 · 0 评论 -
【LeetCode】321c:从链表中移除节点
在本题的单调栈中,栈顶元素小于栈底元素,即递增(若存在递减的逆序对,则逆序对中的后者是多余的)。首先将链表转化为数组来处理较为方便,以及定义好虚拟结点dummy便于处理头结点的情况。类似,考察单调栈,转化为对每个元素求右边第一个比它大的元素。,如果其右侧存在一个具有 严格更大 值的节点,则移除。给你一个链表的头节点。对于列表中的每个节点。返回修改后链表的头节点。原创 2022-11-27 17:23:51 · 480 阅读 · 0 评论 -
【LeetCode】311d:字符串的前缀分数和
对一个字符串的插入,会依次比对每个字符在树中是否存在,若存在则往下走,若不存在则开一个新的分支。由题意得,所有的字符总数不超过1e6,而1e6个int的空间为4M,取N为1e6,则tr[N][26]为100M左右,空间上是满足的。哈希表超时的原因在于存在重复操作,例如对于字符串"abcd",则前缀“abc”和“abcd”都将遍历一次,每个字符被重复计算,而trier树中,每个字符串中的每个字符都只被计算一次。首先,每个字符串可理解为trier树上的一条路径,每个字符为trier上的一条边,头结点。原创 2022-09-21 17:39:36 · 819 阅读 · 2 评论 -
【LeetCode】310c:将区间分为最少组数
若其左端点小于等于最小的右端点,则说明其与所有分组都有重叠(因为已经按照左端点排序过,则当前区间的左端点大于等于先前区间的左端点),因此将其压入堆,形成新的一组。否则,若当前区间左端点大于堆顶区间的右端点,则不用增加组数,只需要更新该组的右端点,即将堆顶弹出再压入该组修正后的右端点。如果两个区间覆盖的范围有重叠(即至少有一个公共数字),那么我们称这两个区间是 相交 的。遍历n个区间时,每个区间涉及到堆的push等操作的复杂度为log级别。通过一个小根堆存储每个分组的代表区间的右端点。需要划分成多少个组。原创 2022-09-12 23:04:53 · 361 阅读 · 0 评论 -
【LeetCode】309c:最长优雅子数组
来表示当前窗口内的各个位上的1的数量,若符合多个数与为0的要求,则每个位置上的1的数量不超过1。其中双指针i一直往前走,j在左边不断维护窗口合法性,若不合法则往右移动,移动结束后j到i这段区间满足要求,每次更新答案(滑动窗口,用状态变量维护窗口内的合法性。由于数的范围在1到10^9,可用31位二进制数来表示状态。每个数的与状态(check()函数),若符合要求则尝试更新。,其中k为以每个位置为结尾的最长优雅数组的平均长度,最好为。的子数组始终视作优雅子数组。中抛弃左边的部分数字,对比。的优雅子数组的长度。原创 2022-09-12 22:46:53 · 1492 阅读 · 0 评论 -
【LeetCode】309b:恰好移动 k 步到达某一位置的方法数目
为第i步到达位置j的方案数。此处由于k与起点终点的数据范围在1~1000,因此其起点不会小于-500,终点不会大于500,因此将起点终点加500,可映射为数组下标,下标范围在0到1500之间,可以开较大的N = 2010的数组区间。周赛时想到的方法:假设向左移动l次,向右移动r次,那么。在一步移动中,你可以向左或者向右移动一个位置。如果所执行移动的顺序不完全相同,则认为两种方法不同。,因此左移和右移的次数都可以计算出,总的方案数相当于。的 不同 方法数目。接下来由状态转移方程求解。个元素中的排列方法,即。原创 2022-09-12 22:10:04 · 522 阅读 · 0 评论 -
【LeetCode】308d:给定条件下构造矩阵
而行条件得到的拓扑排序与列条件得到的拓扑排序是可以独立的,可以同时满足。通过行拓扑得到的数组,每个元素在矩阵中的的行位置就是它在该数组中的下标位置,同样地,该元素的列位置就是它在列拓扑排序数组的下标位置。题中所给的约束关系,比如a在b前面,与图论中a存在一条出边连接到b一致,通过构建邻接表和入度,可以得到符合条件的拓扑排序。显然,若答案不存在,则会产生环,那么拓扑排序所得到的数组个数将小于n。每次弹出队头,更新其邻接点的入度(-- g[t])时,共执行了e次。如果不存在答案,返回一个空的矩阵。......原创 2022-08-28 23:32:01 · 676 阅读 · 0 评论 -
【LeetCode】306c:根据模式串构造最小数字
给你下标从 0 开始、长度为 n 的字符串 pattern ,它包含两种字符,‘I’ 表示 上升 ,‘D’ 表示 下降。如果 pattern[i] == ‘I’ ,那么 num[i] < num[i + 1]。如果 pattern[i] == ‘D’ ,那么 num[i] > num[i + 1]。由数据范围知,答案字符串长度最多为9,长度为9的字符串根据全排列可知共有。num 包含数字 ‘1’ 到 ‘9’ ,其中每个数字 至多 使用一次。函数来求解某一个排列的下一个排列(根据字典序)。...原创 2022-08-14 23:17:57 · 541 阅读 · 0 评论 -
【LeetCode】468. 验证IP地址
468. 验证IP地址题目大意思路代码原题链接:468. 验证IP地址题目大意给定一个字符串 queryIP。如果是有效的IPv4地址,返回 "IPv4" ;如果是有效的IPv6地址,返回 "IPv6" ;如果不是上述类型的IP地址,返回 "Neither" 。有效的IPv4地址 是“x1.x2.x3.x4”形式的IP地址。 其中 0 <= xi <= 255 且 xi 不能包含 前导零。例如: “192.168.1.1” 、 “192.168.1.0” 为有效IPv4地址, “192.原创 2022-05-29 02:15:55 · 512 阅读 · 0 评论 -
【LeetCode】1021. 删除最外层的括号
1021. 删除最外层的括号题目大意思路代码复杂度原题链接:1021. 删除最外层的括号题目大意有效括号字符串为空 “”、“(” + A + “)” 或 A + B ,其中 A 和 B 都是有效的括号字符串,+ 代表字符串的连接。例如,“”,“()”,“(())()” 和 “(()(()))” 都是有效的括号字符串。如果有效字符串 s 非空,且不存在将其拆分为 s = A + B 的方法,我们称其为原语(primitive),其中 A 和 B 都是非空有效括号字符串。给出一个非空有效字符串 s,原创 2022-05-28 00:25:44 · 161 阅读 · 0 评论 -
【LeetCode】面试题 17.11. 单词距离
面试题 17.11. 单词距离题目大意思路代码复杂度面试题 17.11. 单词距离题目大意有个内含单词的超大文本文件,给定任意两个不同的单词,找出在这个文件中这两个单词的最短距离(相隔单词数)。如果寻找过程在这个文件中会重复多次,而每次寻找的单词不同,你能对此优化吗?示例:输入:words = ["I","am","a","student","from","a","university","in","a","city"], word1 = "a", word2 = "student"输出:1原创 2022-05-27 00:18:43 · 155 阅读 · 0 评论 -
【LeetCode】699. 掉落的方块
699. 掉落的方块题目大意思路代码复杂度原题链接:699. 掉落的方块题目大意在二维平面上的 x 轴上,放置着一些方块。给你一个二维整数数组 positions ,其中 positions[i] = [lefti, sideLengthi] 表示:第i个方块边长为sideLengthi,其左侧边与 x 轴上坐标点 lefti 对齐。每个方块都从一个比目前所有的落地方块更高的高度掉落而下。方块沿 y 轴负方向下落,直到着陆到 另一个正方形的顶边 或者是 x 轴上 。一个方块仅仅是擦过另一个方块的左原创 2022-05-26 15:28:02 · 240 阅读 · 0 评论 -
【LeetCode】467. 环绕字符串中唯一的子字符串
467. 环绕字符串中唯一的子字符串题目大意思路代码复杂度原题链接:467. 环绕字符串中唯一的子字符串题目大意把字符串 s 看作是 “abcdefghijklmnopqrstuvwxyz” 的无限环绕字符串,所以 s 看起来是这样的:“…zabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcd…” .现在给定另一个字符串 p 。返回 s 中 唯一 的 p 的 非空子串 的数量 。示例:输入: p = "a"输出: 1解释: 字符串原创 2022-05-25 01:55:27 · 445 阅读 · 0 评论 -
【LeetCode】965. 单值二叉树
965. 单值二叉树题目大意思路代码复杂度原题链接:965. 单值二叉树题目大意如果二叉树每个节点都具有相同的值,那么该二叉树就是单值二叉树。只有给定的树是单值二叉树时,才返回 true;否则返回 false。示例:数据范围:给定树的节点数范围是 [1, 100]。每个节点的值都是整数,范围为 [0, 99] 。思路取根节点的值,然后开始dfs深度优先遍历该树;若某结点为空,包括根节点为空的情况,则返回true;若某结点的值不等于根节点的值,则返回false;若某结点的值等于跟原创 2022-05-24 00:33:55 · 229 阅读 · 0 评论 -
【LeetCode】675. 为高尔夫比赛砍树
675. 为高尔夫比赛砍树题目大意思路代码复杂度原题链接:675. 为高尔夫比赛砍树题目大意你被请来给一个要举办高尔夫比赛的树林砍树。树林由一个 m x n 的矩阵表示, 在这个矩阵中:0 表示障碍,无法触碰1 表示地面,可以行走比1大的数 表示有树的单元格,可以行走,数值表示树的高度每一步,你都可以向上、下、左、右四个方向之一移动一个单位,如果你站的地方有一棵树,那么你可以决定是否要砍倒它。你需要按照树的高度从低向高砍掉所有的树,每砍过一颗树,该单元格的值变为 1(即变为地面)。你将从(原创 2022-05-23 01:04:04 · 374 阅读 · 0 评论 -
【LeetCode】464. 我能赢吗
464. 我能赢吗题目大意思路代码复杂度原题链接:464. 我能赢吗很少做博弈论的题目,看了题解后很受启发,写了点总结。题目大意在 “100 game” 这个游戏中,两名玩家轮流选择从 1 到 10 的任意整数,累计整数和,先使得累计整数和 达到或超过 100 的玩家,即为胜者。如果我们将游戏规则改为 “玩家 不能 重复使用整数” 呢?例如,两个玩家可以轮流从公共整数池中抽取从 1 到 15 的整数(不放回),直到累计整数和 >= 100。给定两个整数 maxChoosableInte原创 2022-05-22 17:46:08 · 358 阅读 · 0 评论 -
【LeetCode】961. 在长度 2N 的数组中找出重复 N 次的元素
961. 在长度 2N 的数组中找出重复 N 次的元素题目大意思路代码复杂度961. 在长度 2N 的数组中找出重复 N 次的元素题目大意给你一个整数数组 nums ,该数组具有以下属性:nums.length == 2 * n.nums 包含 n + 1 个 不同的 元素nums 中恰有一个元素重复 n 次找出并返回重复了 n 次的那个元素。示例:输入:nums = [1,2,3,3]输出:3输入:nums = [2,1,2,5,3,2]输出:2输入:nums = [5,1,原创 2022-05-21 14:07:43 · 359 阅读 · 0 评论 -
【LeetCode】436. 寻找右区间
436. 寻找右区间题目大意思路代码复杂度原题链接:436. 寻找右区间题目大意给你一个区间数组 intervals ,其中 intervals[i] = [starti, endi] ,且每个starti都 不同 。区间 i 的 右侧区间 可以记作区间j,并满足startj >= endi,且startj最小化 。返回一个由每个区间 i 的 右侧区间 的最小起始位置组成的数组。如果某个区间i不存在对应的 右侧区间 ,则下标i处的值设为 -1 。示例:输入:intervals = [[1原创 2022-05-20 01:04:36 · 174 阅读 · 0 评论 -
【LeetCode】462. 最少移动次数使数组元素相等 II
462. 最少移动次数使数组元素相等 II题目大意思路代码复杂度原题链接:462. 最少移动次数使数组元素相等 II题目大意给你一个长度为n的整数数组 nums ,返回使所有数组元素相等需要的最少移动数。在一步操作中,你可以使数组中的一个元素加1或者减1。示例:输入:nums = [1,2,3]输出:2解释:只需要两步操作(每步操作指南使一个元素加 1 或减 1):[1,2,3] => [2,2,3] => [2,2,2]输入:nums = [1,10,2,9]原创 2022-05-20 00:32:25 · 341 阅读 · 0 评论 -
【LeetCode】668. 乘法表中第k小的数
668. 乘法表中第k小的数题目大意思路代码时间复杂度原题链接:668. 乘法表中第k小的数题目大意几乎每一个人都用 乘法表。但是你能在乘法表中快速找到第k小的数字吗?给定高度m 、宽度n 的一张 m * n的乘法表,以及正整数k,你需要返回表中第k 小的数字。例子:输入: m = 3, n = 3, k = 5输出: 3解释: 乘法表:1 2 32 4 63 6 9第5小的数字是 3 (1, 2, 2, 3, 3).输入: m = 2, n = 3, k = 6输出: 6原创 2022-05-18 01:06:21 · 244 阅读 · 0 评论 -
【LeetCode】82. 删除排序链表中的重复元素 II
82. 删除排序链表中的重复元素 II题目大意思路源代码类似题目题目大意给定一个已排序的链表的头 head , 删除原始链表中所有重复数字的节点,只留下不同的数字 。返回 已排序的链表 。示例:数据范围:链表中节点数目在范围 [0, 300] 内-100 <= Node.val <= 100题目数据保证链表已经按升序 排列思路思路与83. 删除排序链表中的重复元素相同,区别仅在于该题不保留重复元素p->next=q->next,83保留一个重复元素p->n原创 2022-05-17 01:39:49 · 253 阅读 · 0 评论 -
【LeetCode】83. 删除排序链表中的重复元素
83. 删除排序链表中的重复元素题目大意思路源代码类似题目题目大意给定一个已排序的链表的头 head , 删除所有重复的元素,使每个元素只出现一次 。返回 已排序的链表 。示例:数据范围:链表中节点数目在范围 [0, 300] 内-100 <= Node.val <= 100题目数据保证链表已经按升序 排列思路开一个虚拟头结点dummy,从dummy的下一个节点开始开拓答案链表,利用哨兵检查新结点的重复情况,其中dummy的作用在于兼容头结点head也重复的情况。具体地原创 2022-05-17 01:32:34 · 238 阅读 · 0 评论 -
【LeetCode】80. 删除有序数组中的重复项 II
80. 删除有序数组中的重复项 II题目大意思路源代码复杂度分析类似题目原题链接:80. 删除有序数组中的重复项 II题目大意给你一个有序数组 nums ,请你 原地 删除重复出现的元素,使每个元素 最多出现两次 ,返回删除后数组的新长度。不要使用额外的数组空间,你必须在 原地 修改输入数组 并在使用 O(1) 额外空间的条件下完成。示例:输入:nums = [1,1,1,2,2,3]输出:5, nums = [1,1,2,2,3]输入:nums = [0,0,1,1,1,1,2,3,3]原创 2022-05-17 00:33:06 · 113 阅读 · 0 评论 -
【LeetCode】26. 删除有序数组中的重复项
2022.05.17题目大意思路代码复杂度分析类似题目题目大意给你一个升序排列的数组nums,请你 原地 删除重复出现的元素,使每个元素 只出现一次 ,返回删除后数组的新长度。元素的 相对顺序 应该保持 一致 。由于在某些语言中不能改变数组的长度,所以必须将结果放在数组nums的第一部分。更规范地说,如果在删除重复项之后有 k 个元素,那么 nums 的前 k 个元素应该保存最终结果。将最终结果插入 nums 的前 k 个位置后返回 k 。不要使用额外的空间,你必须在 原地 修改输入数组 并在使用原创 2022-05-17 00:22:18 · 152 阅读 · 0 评论 -
C++STL
vector,变长数组,倍增的思想 size() 返回元素个数 empty 返回是否为空 clear() 清空 front(),back()第一个数,最后一个数 push_back(),pop_back() begin(),end()迭代器 起始元素位置,末尾元素的后一个位置 []支持随机寻址 支持比较运算,按照字典序pair<int,int> (底层为结构体) first,第一个元素 second,第二个元素 支持比较运算原创 2022-01-11 16:51:24 · 405 阅读 · 0 评论 -
C++五子棋(100行)
#include <iostream>using namespace std;const int N = 110;int n;char g[N][N]; // 棋盘 int d[N][N]; // 标记棋盘状态(也可直接用g) int dx[] = {-1, -1, 0, 1, 1, 1, 0, -1}, dy[] = {0, 1, 1, 1, 0, -1, -1, -1}; // 位移矢量 char sign[] = {'+', 'o', 'x'}; // 棋盘格子标志,玩原创 2022-01-08 22:01:32 · 457 阅读 · 0 评论 -
[KMP]实现 strStr()、循环节大小计算
题目描述:实现 strStr() 函数。给你两个字符串 haystack 和 needle ,请你在 haystack 字符串中找出 needle 字符串出现的第一个位置(下标从 0 开始)。如果不存在,则返回 -1 。LeetCode原题链接示例 1:输入:haystack = “hello”, needle = “ll”输出:2示例 2:输入:haystack = “aaaaa”, needle = “bba”输出:-1示例 3:输入:haystack = “”, needle原创 2021-05-01 14:55:54 · 158 阅读 · 0 评论 -
1.两数之和(梦开始的地方)
题目描述给定一个整数数组nums和一个整数目标值target,请你在该数组中找出和为目标值的那两个整数,并返回它们的数组下标。你可以假设每种输入只会对应一个答案。但是,数组中同一个元素在答案里不能重复出现。你可以按任意顺序返回答案。示例:输入:nums = [2,7,11,15], target = 9输出:[0,1]解释:因为 nums[0] + nums[1] == 9 ,返回 [0, 1] 。思路:定义一个哈希表用于存储数字的下标,则遍历数组即可,对unorder_map作插入等操作原创 2021-04-09 21:01:00 · 171 阅读 · 0 评论 -
3. 无重复字符的最长子串
题目描述:给定一个字符串,请你找出其中不含有重复字符的最长子串的长度。示例:输入: s = “abcabcbb”输出: 3解释: 因为无重复字符的最长子串是 “abc”,所以其长度为 3。思路:双指针算法,动态维护哈希表进行优化。从直觉上可以看出指针i右移的过程中,指针j(j为距离i最远的保证j到i的子串满足条件的指针)也同样有向右的趋势(即不动或向右),也可通过反证易得。因而,指针i和j都最多移动n次,故时间复杂度为O(2n) = O(n).代码:class Solution {pub原创 2021-04-09 20:51:41 · 71 阅读 · 0 评论 -
2.两数相加
LeetCode2. 两数相加题目描述:给你两个非空的链表,表示两个非负的整数。它们每位数字都是按照逆序的方式存储的,并且每个节点只能存储一位数字。请你将两个数相加,并以相同形式返回一个表示和的链表。你可以假设除了数字 0 之外,这两个数都不会以 0 开头。示例:输入:l1 = [2,4,3], l2 = [5,6,4]输出:[7,0,8]解释:342 + 465 = 807.tips:模拟简单的加法运算,可定义伪结点,减少特判第一个点。代码:class Solution {pub原创 2021-04-09 20:23:04 · 91 阅读 · 0 评论 -
学姐点名
思路一因为N范围不大,故创建一个数组,哈希代码:#include <iostream>#include <cstring> using namespace std;int N;int stu;int main(){ while(scanf("%d", &N) != EOF) { int hashset[N + 1]; memset(hashset, 0, sizeof hashset); ..原创 2021-04-06 20:05:02 · 579 阅读 · 0 评论 -
BOJ-136. 反转单词
题目描述:思路:双指针算法,这里用的char[]数组,string应该会更简洁.#include <iostream>#include <cstring>using namespace std;char str[1010];string s;int len(char str[]){ int cnt = 0; for(int i = 0;; i ++ ) { if(str[i]) cnt ++; else原创 2021-03-30 00:52:18 · 105 阅读 · 1 评论 -
LeetCode周赛234
LeetCode 5713. 字符串中不同整数的数目原题链接思路:双指针算法,用到unordered_setclass Solution {public: int numDifferentIntegers(string word) { unordered_set<string> nums; for(int i = 0; i < word.size(); i ++ ) { if(! isdigit(wo原创 2021-03-29 23:50:49 · 117 阅读 · 0 评论 -
BOJ-304. 旋转图像-计算机一2014
C++代码:#include <iostream>using namespace std;int T, n, m;int angle;int main(){ cin >> T; for(int i = 0; i < T; i ++ ) { cin >> n >> m; char a[n][m]; for(int j = 0; j < n; j ++ ) ..原创 2021-03-27 20:25:32 · 131 阅读 · 0 评论 -
BOJ-311. 图像识别-计算机二2014
思路dfs某个点可以到达的区域同时做好标记。依次遍历矩阵上的点,若未标记,则对其dfs,区域数++;若已标记,说明该区域已被统计,跳过。代码:#include <iostream>#include <math.h>using namespace std; const int NN = 110; int Mat[NN][NN];bool mark[NN][NN];int dx[8] = {-1, -1, 0, 1, 1, 1, 0, -1}, dy[8] ..原创 2021-03-27 20:13:19 · 158 阅读 · 0 评论 -
区间选点
区间选点给定N个闭区间[ai,bi],请你在数轴上选择尽量少的点,使得每个区间内至少包含一个选出的点。输出选择的点的最小数量。位于区间端点上的点也算作区间内。输入格式第一行包含整数N,表示区间数。接下来N行,每行包含两个整数ai,bi,表示一个区间的两个端点。输出格式输出一个整数,表示所需的点的最小数量。数据范围1≤N≤10510^5105,−10910^9109≤ai≤bi≤10910^9109样例输入样例:3-1 12 43 5输出样例:2贪心思路1.将每原创 2021-02-16 23:15:39 · 432 阅读 · 0 评论 -
前缀和与差分小结
前缀和与差分小结前缀和一维数组二维数组差分一维数组二维数组前缀和一维数组前缀和其实就相当于数列中的前n项和,在m次询问求某个子序列的和时,如果每次都遍历序列,则时间复杂度为O(n*m),而若先统计前缀和,则时间复杂度为O(n+m)。关键步骤如下所示: //输入 for(int i = 1; i <= n; i ++) scanf("%d", &a[i]); //计算前缀和 for(int i = 1; i <= n; i ++) s[i] = s[i原创 2021-01-16 16:05:49 · 591 阅读 · 0 评论 -
快速排序与归并排序刷题小结
第k个数题目分析代码总结题目给定一个长度为n的整数数列,以及一个整数k,请用快速选择算法求出数列从小到大排序后的第k个数。输入格式第一行包含两个整数 n 和 k。第二行包含 n 个整数(所有整数均在1~109范围内),表示整数数列。输出格式输出一个整数,表示数列的第k小数。数据范围1≤n≤100000,1≤k≤n输入样例:5 32 4 1 5 3输出样例:3分析这道题可以先排序再取出第k个数,例如先进行快速排序,则时间复杂度为O(nlogn)。还可以采用快速选择算法,使得时原创 2021-01-15 22:18:41 · 664 阅读 · 0 评论