文章分类 - 六月集训
摘要:图 1. 1514. 概率最大的路径 思路: 贪心的每次选择成功率最高的路走,每次记录到达每个点的最大成功率,返回end点的成功率即可。 class Solution { // 要求最大的成功概率,即不能走重复的路,否则,每重复一次,乘一个小于1的数,成功率会变小 #define maxn 2002
阅读全文
摘要:@ 线段树 1. 731. 我的日程安排表 II 思路: 利用线段树维护区间的增删 mask利用位运算记录区间安排的任务数,mask的第i位为1,则代表出现了i次 lazy代表安排的任务数,作为位移的次数,用于更新mask和线段树的标记更新 class MyCalendarTwo { struct
阅读全文
摘要:二叉搜索树 1. 700. 二叉搜索树中的搜索 思路: val大了去右子树找,val小了去左子树找,找到返回答案结点。找到叶节点还没找到则返回null。 /** * Definition for a binary tree node. * struct TreeNode { * int val; *
阅读全文
摘要:二叉树 1. 331. 验证二叉树的前序序列化 思路: 除根节点提供两个出度 叶节点提供一个入度 其余结点提供一个入度和两个出度 通过数学计算可知,满足成为一颗二叉树的条件是,树的出度等于入度,且中间不能出现某个结点提供入度后入度大于出度的情况 class Solution { public: bo
阅读全文
摘要:树 1. 1361. 验证二叉树 思路: 考虑是否能生成二叉树,从入度的角度看 (1) 不存在indeg == 0的点,就没有树根,不是二叉树 (2) 存在indeg >= 2 的点,说明该结点有两个父节点,不是二叉树 (3) 有大于等于2个的indeg == 0的结点,说明不止一棵树,是森林 如果
阅读全文
摘要:广度优先搜索 1. 2059. 转化数字的最小运算数 思路: 用数组中的数对start进行三种不同的操作,获得0~1000之间的数字,找到结果后返回。时间复杂度$O(n * C)$, $C = 1000$生成数字的范围。 struct MY_NUM { int num; int step; }; c
阅读全文
摘要:队列 1. 933. 最近的请求次数 思路: 让请求时间入队,让队首请求时刻小于t-3000的请求出队,返回队列中的请求个数。 class RecentCounter { int front, rear; int data[10010]; public: RecentCounter() { fron
阅读全文
摘要:深度优先搜索 1. 508. 出现次数最多的子树元素和 思路: (1) 先序遍历一遍二叉树,统计出每个结点对应的子树元素和 (2) 将最大的元素和放入答案数组。 /** * Definition for a binary tree node. * struct TreeNode { * int va
阅读全文
摘要:栈 1. 剑指 Offer 31. 栈的压入、弹出序列 思路: 模拟栈的压入过程 ,并利用一个指针指向popped序列的起始位置。当栈顶和popped序列相同时,弹栈,popped的指针向后移动一位;否则将pushed序列中的元素依次压栈。如果最后栈弹空,且指针指向了popped末尾,则满足题意。
阅读全文
摘要:双向链表 1. 432. 全 O(1) 的数据结构 思路: $O(1)$时间查询,则立刻想到hash表,这题又是双向链表专题的,于是想办法把双向链表和hash表结合起来。 (1) 用双向链表存储键值为key的结点,只需要存一个,再次inc只需要将其对应的count值+1即可 (2) hash表中将k
阅读全文
摘要:链表 1. 328. 奇偶链表 思路: 利用两个指针,交替连接得到两个(奇偶)链表,最后将两个链表合并。 注意特判链表为空和只有一个元素的情况 /** * Definition for singly-linked list. * struct ListNode { * int val; * List
阅读全文
摘要:矩阵 1. 面试题 01.08. 零矩阵 思路: 标记0所在得行和列,对应行列全部置为0。 class Solution { public: void setZeroes(vector<vector<int>>& matrix) { int n = matrix.size(), i; int m =
阅读全文
摘要:位运算 1. 868. 二进制间距 思路: 记录相邻两个1的位置,作差取最大值即可。 class Solution { public: int binaryGap(int n) { int ans = 0; int i = 1, j = 0; while (n) { if ((n & 1) && !
阅读全文
摘要:二分查找 1. 981. 基于时间的键值存储 思路: 找到大于等于timestamp + 1的最小位置,返回其之前一位置即为答案,否则不存在答案。 class TimeMap { unordered_map<string, map<int, string>> hash; public: TimeMa
阅读全文
摘要:前缀和 1. 1838. 最高频元素的频数 思路: 枚举每个数字作为频数最大元素时对应的情况。 (1) 对数组排序 (2) 枚举每个元素作为频数最大的元素时,k次操作最多能将多少个元素变成当前元素。显然,排序后元素的选取应该是从频数最大的元素往前选取。 (3) 得到每个元素作为最大元素时对应的频数,
阅读全文
摘要:哈希表 1. 442. 数组中重复的数据 思路1: 首先是开空间为$O(n)$的数组空间,建立hash映射。 class Solution { public: vector<int> findDuplicates(vector<int>& nums) { bool hash[100001]; mem
阅读全文
摘要:滑动窗口 1. 1984. 学生分数的最小差值 思路: 对成绩升序排列,利用一个长度为k的窗口在数组上滑动,最小差值就是窗口右侧值减去窗口左侧值得最小值。 class Solution { public: int minimumDifference(vector<int>& nums, int k)
阅读全文
摘要:双指针 1. 2000. 反转单词前缀 思路: 遍历找到ch出现的位置r,从0~r翻转word即可。 class Solution { public: string reversePrefix(string word, char ch) { int word_len = word.length();
阅读全文
摘要:贪心 1. 1221. 分割平衡字符串 思路: 贪心的选择'L'与'R'每次出现数量相等的L或R,答案+1,并再次统计下一组。 class Solution { public: int balancedStringSplit(string s) { int s_len = s.length(); i
阅读全文
摘要:@ 排序 1. 1464. 数组中两元素的最大乘积 思路: 降序排列,取下标最小的两个数,即为值最大的两个数 class Solution { static bool cmp(const int a, const int b) { return a > b; } public: int maxPro
阅读全文