随笔分类 - 算法
记录自己不大熟的LeetCode题目
摘要:题目链接 179. 最大数 思路 转自宫水三叶大佬的题解 对于 nums 中的任意两个值 a 和 b,我们无法直接从常规角度上确定其大小/先后关系。 但我们可以根据「结果」来决定 a 和 b 的排序关系: 如果拼接结果 ab 要比 ba 好,那么我们会认为a应该放在b前面。 代码 class Sol
阅读全文
摘要:题目链接 27. 移除元素 思路 先设定变量idx,指向待插入位置。idx初始值为0。 然后从题目的「要求/保留逻辑」出发,来决定当遍历到任意元素 x 时,应该做何种决策: 如果当前元素 x 与移除元素 val 相同,那么跳过该元素 如果当前元素 x 与移除元素 val 不同,那么我们将其放到下标
阅读全文
摘要:判断区间是否重叠 题目链接 252.合并区间 给定一个会议时间安排的数组 intervals ,每个会议时间都会包括开始和结束的时间 intervals[i] = [starti, endi] ,请你判断一个人是否能够参加这里面的全部会议。 示例 1: 输入: intervals = [[0,30]
阅读全文
摘要:题目链接 206. 反转链表 思路 先添加一个头结点real_head。再设置real_head.next = null,通过不断运用头插法将p所指的结点插入到real_head.next,完成反转操作。 代码 class Solution { public ListNode reverseList
阅读全文
摘要:原文链接:Leetcode面试高频题分类刷题总结 排序类(Sort) 基础知识:快速排序(Quick Sort), 归并排序(Merge Sort)的原理与代码实现。需要能讲明白代码中每一行的目的。快速排序时间复杂度平均状态下O(NlogN),空间复杂度O(1),归并排序最坏情况下时间复杂度O(Nl
阅读全文
摘要:题目链接 148. 排序链表 思想 分割 cut 环节: 找到当前链表中点,并从中点将链表断开(以便在下次递归 cut 时,链表片段拥有正确边界) 我们使用 fast,slow 快慢双指针法,奇数个节点找到中点,偶数个节点找到中心左边的节点。 找到中点 slow 后,执行 slow.next = N
阅读全文
摘要:题目链接 股票价格跨度 注意事项 使用单调栈 代码 class StockSpanner { public: StockSpanner() { this->stk.emplace(-1, INT_MAX); this->idx = -1; } int next(int price) { idx++;
阅读全文
摘要:题目链接 672. 灯泡开关 Ⅱ 思路 根据题意,我们先找到每个开关影响的灯 如图所示,两个虚框的灯的状态完全一致,因此我们任意取一盏灯i,则i的状态和i + 6的状态完全一致,所以灯的状态的周期T = 6 因此我们只需要观察前六盏灯的状态。 我们设六盏灯的编号为6k+1、6k+2、6k+3、6k+
阅读全文
摘要:题目链接 652. 寻找重复的子树 注意事项 将一颗子树按照先序遍历的方式组装成一个字符串,方便进行比较。 使用unordered_map进行数量判断。 代码 /** * Definition for a binary tree node. * struct TreeNode { * int val
阅读全文
摘要:题目链接 注意事项 根据满二叉树的节点编号规则:若根节点编号为 u,则其左子节点编号为 u << 1,其右节点编号为 u << 1 | 1。 一个朴素的想法是:我们在 DFS过程中使用两个哈希表分别记录每层深度中的最小节点编号和最大节点编号,两者距离即是当前层的宽度,最终所有层数中的最大宽度即是答案
阅读全文
摘要:题目链接 745. 前缀和后缀搜索 注意事项 预先计算出每个单词的前缀后缀组合可能性,用特殊符号连接,作为键,对应的最大下标作为值保存入哈希表。检索时,同样用特殊符号连接前后缀,在哈希表中进行搜索。 代码 #include <bits/stdc++.h> using namespace std; c
阅读全文
摘要:题目链接 565. 数组嵌套 注意事项 题面形式类似于并查集,每个元素都是从i到nums[i]的有向边,相连的元素形成一条链。 从一个元素切入,然后一直走到对应链的末尾,统计这条链上的数目。统计完再换下一条链统计。一直到所有元素都被访问过。 代码 class Solution { public: i
阅读全文
摘要:题目链接 1438. 绝对差不超过限制的最长连续子数组 注意事项 multiset中取最大值:rebegin multiset中取最小值:begin 代码 class Solution { public: int longestSubarray(vector<int>& nums, int limi
阅读全文
摘要:题目链接 919. 完全二叉树插入器 注意事项 在构建该数据结构的时候,可以使用两个队列,来找到完全二叉树不含两个子结点的结点 代码 class CBTInserter { private: queue<TreeNode*> q; TreeNode* root; public: CBTInserte
阅读全文
摘要:题目链接 1302. 层数最深叶子节点的和 注意事项 要用非递归的方式求二叉树深度(即层次遍历BFS) 代码 class Solution { public: int deepestLeavesSum(TreeNode* root) { vector<pair<int, int>> nodes; i
阅读全文
摘要:题目链接 558. 四叉树交集 题目代码 class Solution { public: Node* intersect(Node* quadTree1, Node* quadTree2) { if (quadTree1->isLeaf){ return quadTree1->val ? new
阅读全文