
面试算法
每周Hard记录
solego
这个作者很懒,什么都没留下…
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
【笔试】备战秋招,每日一题|20230415携程研发岗笔试
20230415携程研发岗笔试题解原创 2023-04-24 23:00:56 · 834 阅读 · 1 评论 -
【Gale Shapley 婚姻稳定匹配算法实现】
【Gale Shapley 算法实现】原创 2022-10-16 20:56:44 · 655 阅读 · 0 评论 -
【算法】手写优先队列
自定义部分优先队列原创 2022-09-10 10:31:23 · 290 阅读 · 0 评论 -
【面试系列】LRU缓存
题意:原题链接代码:struct DoubleListNode { DoubleListNode* prev, *next; int key; int val; DoubleListNode() : prev(NULL), next(NULL), key(-1), val(-1){} DoubleListNode(int key, int val) : prev(NULL), next(NULL), key(key), val(val){}};class原创 2021-08-20 21:04:46 · 85 阅读 · 0 评论 -
【面试系列】N叉树的层序遍历
题意:原题链接思路:先加入第一层,然后遍历该层所有元素加入到新的一层中,再把当前层的元素加入到答案中即可。代码:/*// Definition for a Node.class Node {public: int val; vector<Node*> children; Node() {} Node(int _val) { val = _val; } Node(int _val, vector<Node*原创 2021-08-19 14:45:29 · 106 阅读 · 0 评论 -
【面试系列】复原IP地址
题意:原题链接思路:枚举分界点,保证分界后的每段是合法的才进行深搜即可。代码:类成员变量版本class Solution {public: string str; vector<string> res; int a[4]; int n; int get(int l, int r) { if(r - l > 0 && str[l] == '0') return -1; i原创 2021-08-17 18:22:00 · 78 阅读 · 0 评论 -
【面试系列】重排链表
题意:原题链接思路:快慢指针找到中点(或者先遍历得到长度,再遍历一半也可行)反转后半部分归并两部分代码:/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode() : val(0), next(nullptr) {} * ListNode(int x) : val(x), next(nullptr) {原创 2021-08-18 17:33:40 · 82 阅读 · 0 评论 -
【面试系列】反转链表II
题意:原题链接思路:先找到L,RL,RL,R,由于我们是翻转区间[L,R][L,R][L,R],因此需要知道L的上一个结点所以遍历到L的上一个结点即可,之后再遍历到R,由于翻转后需要将[L,R][L,R][L,R]与原链表拼接,所以记录Rnext为原R->next。之后反转链表进行拼接即可。代码:/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *原创 2021-08-18 17:30:49 · 119 阅读 · 0 评论 -
【面试系列】最小路径和
题意:原题链接代码:class Solution {public: int minPathSum(vector<vector<int>>& grid) { const int INF = 0x3f3f3f3f; int n = grid.size(), m = grid[0].size(); vector<vector<int>> f(n, vector<int>(m, INF原创 2021-08-17 17:38:19 · 70 阅读 · 0 评论 -
【面试系列】合并K个升序链表
题意:思路:1、O(nm)O(nm)O(nm)枚举,nnn为总结点数,mmm为链表数2、优先队列先将mmm个首元素加入,然后每次取最小的,再添加进去其下一个,时间复杂度:O(nlogm)O(n\log m)O(nlogm)代码:1、/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode() : val(0), nex原创 2021-08-18 18:10:56 · 119 阅读 · 0 评论 -
环形链表II
原题链接本题要求找到环的入口,且O(n)O(n)O(n)的时间复杂度,O(1)O(1)O(1)的空间复杂度。参考了很是充分证明的题解,很多疑惑得到了解决先判断是否有环:快慢指针fast,slow,直到两者第二次相遇的时候那么判断确定有环。(第一次是在起点)考虑如何找到入口,设headheadhead到链表环入口的结点数是aaa,环的结点数是bbbf=2s=s+nbf=2s=s+nbf=2s=s+nb,表示在fff和sss再次相遇时,fff比sss多走了nnn次环。f=2nb,s=nbf=原创 2021-11-30 22:57:04 · 365 阅读 · 0 评论 -
【面试系列】对称二叉树
题意:原题链接代码:/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode() : val(0), left(nullptr), right(nullptr) {} * TreeNode(int x) : val(x), left(nullptr), right(nu原创 2021-08-20 22:00:59 · 169 阅读 · 0 评论 -
最大非负正方形权和O(n * m)
给定一个矩阵,求其中和最大的正方形,且正方形的每个元素都是非负数(≥0)(\geq 0)(≥0)方案111:枚举边长,然后枚举左上角,然后需要判断这个正方形是否全为非负数。这样整体的复杂度为:O(min(n,m)×n2×m2)O(min(n, m) \times n^2 \times m^2)O(min(n,m)×n2×m2)方案222:解决上述解决方案的问题,预处理出二维前缀和pre[i][j]pre[i][j]pre[i][j],pre[i][j]pre[i][j]pre[i][j原创 2021-10-26 13:23:12 · 350 阅读 · 0 评论 -
【面试系列】分割数组的最大值
题意:原题链接思路:通常来说,求最小值的最大和最大值最小这种问题,基本思路都是二分答案。二分答案,进行判断是否合法来更新二分区间即可。这里checkcheckcheck函数贪心地选取子数组,我们会传入一个当前二分的答案maxmaxmax,只要我们的选取的连续子数组的和不超过maxmaxmax,那么就可以贪心的累加,这样对后面的分组不会造成额外的和导致其超过maxmaxmax。代码:class Solution {public: int splitArray(vector<in原创 2021-08-17 18:49:16 · 127 阅读 · 0 评论 -
【面试系列】三数之和
题意:原题链接思路:两数之和的进阶版,先排序。那么只需要固定一个左端点,对右部分执行两数之和操作,但是其中要考虑到不能有重复的组合出现。我们考虑如下:即nums[i],nums[j],nums[k]nums[i],nums[j],nums[k]nums[i],nums[j],nums[k]三个数,那么由于nums[i]nums[i]nums[i]是不断递增的,因此如果出现相同的nums[i]nums[i]nums[i],那么就会导致出现重复的组,对于nums[j]nums[j]nums[j]来说是原创 2021-08-19 11:06:24 · 105 阅读 · 0 评论 -
【面试系列】区间绝对众数问题
题意:原题链接思路:线段树和摩尔投票参考题解代码:struct Node { int l, r; int x, y; Node operator + (const Node &A) const { Node t; t.l = min(l, A.l); t.r = max(r, A.r); if(x == A.x) t.x = x, t.y = y + A.y; else if(y &g原创 2021-08-23 17:37:34 · 304 阅读 · 0 评论 -
LeetCode4. 寻找两个正序数组的中位数
题意:给定长度为nnn的数组AAA和长度为mmm的数组BBB,均为正序数组,请你求出这两个数组中所有元素的中位数。要求:O(log(n+m))O(\log (n+m))O(log(n+m))的时间复杂度题解:两个数组正序合并和得到数组ccc那么中位数是数组ccc的第⌊n+m+12⌋\lfloor\frac{n+m+1}{2}\rfloor⌊2n+m+1⌋和第⌊n+m+22⌋\lfloor\frac{n+m+2}{2}\rfloor⌊2n+m+2⌋个数的平均值这里解释下为什么是求数组ccc的原创 2021-10-08 15:12:56 · 83 阅读 · 0 评论 -
【面试系列】划分字母区间
题意:原题链接思路:由于每个字母只能被划分在一个区间内,所以我们可以考虑这个字母的区间范围。这样就得到了至多262626个字母的区间范围。所以有区间范围重叠的字母必须都被分到一个区间内,因此这个问题就转换为合并区间问题。排序后贪心合并即可。代码:class Solution {public: vector<int> partitionLabels(string s) { const int INF = 0x3f3f3f3f; i原创 2021-08-19 13:02:24 · 148 阅读 · 0 评论 -
【面试系列】反转链表
题意:原题链接代码:1、1、1、递归/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode() : val(0), next(nullptr) {} * ListNode(int x) : val(x), next(nullptr) {} * ListNode(int x, ListNode *next原创 2021-08-17 17:20:40 · 84 阅读 · 0 评论 -
一周Hard (2021.12.20-2021.12.26)
由于除了刷题外还有些个人的事情,所以大概本周的安排是这样的:本周前两天先研究下关于在周赛272中遇到的问题,打算思考明白并给出一个详细的证明对于周赛272使我回忆起LIS,打算对相应的题目进行学习另外大概是要重新学习DP了,先把挖的坑补完此外是需要重新琢磨下树状数组了,若干天后理解更为深刻了?(对区间修改和区间查询的学习)...原创 2021-12-19 22:12:22 · 506 阅读 · 0 评论 -
一周Hard (2021.12.13-12.19)
这周事情比较多,Hard可能会鸽点630. 课程表III简单点说,本题就是变种题原模型大概是:给一定量的课程及其起止时间,时间安排好的情况下,最多可以上多少节课。这种问题就是典型的求不相交的情况下的最多可以获得的线段数量。那么本题在原模型的基础上,将起止时间改成了不限开始时间,但是给定了上完课程的最迟时间。那么我们就可以不停地堆这些课程,同样的,也是需要尽可能保留结束时间越早的课程,这样可以使得更多的课程能被学习。同样的贪心操作,优先选择截止时间早的课程,尽可能保证这些课程可以被学习到。但是原创 2021-12-16 00:37:24 · 1137 阅读 · 0 评论 -
一周Hard (2021.12.06-2021.12.12)
37. 解数独利用位运算进行极致优化,某种程度上可能会减少计算?class Solution {public: vector<int> r; vector<int> c; vector<int> b; unordered_map<int, int> bit = { {1, 0}, {2, 1}, {4, 2}, {8, 3}, {16原创 2021-12-06 20:10:42 · 375 阅读 · 0 评论 -
一周Hard (2021.11.29-2021.12.05)
862. 和至少为 K 的最短子数组原创 2021-11-29 13:11:34 · 342 阅读 · 0 评论 -
一周Hard (2021.11.26-2021.11.28)
124. 二叉树中的最大路径和考虑以每个点为必经点的最大路径和,即dfsdfsdfs每个点找到其左子树和右子树最大值,注意,最大值还需大于000才对答案有正贡献。最后选取和最大的一条链返回,如果左右子树最大值均小于000,则可以不选取左右子树。/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; *原创 2021-11-26 21:18:18 · 279 阅读 · 0 评论