Leetcode 面试算法刷题
市面上有很多 leetcode 算法教程,但是我认为自己算法基础非常的差,因此觉得 yxc 能把算法思路从无到有讲给我的教程更为适合,视频是免费的在 B 站。
我在三周内听了 week 1 - week 7 的内容,大概是 70 道题目,7 个主题。
Acwing 2019 leetcode 打卡活动
Week 1 二分专题
Week 2 链表专题
Week 3 树专题
Week 4 字符串专题
Week 5 搜索专题(DFS + 回溯)
Week 6 双指针、滑动窗口、单调栈/单调队列
Week 7 基本数据结构
主要是哈希表、平衡树之类的
Week 8 动态规划
Leetcode 企业经典面试题
快手
- Leetcode 268. 丢失的数字
题目解读:n + 1 个数字放在 n 个盒子里,找到没有被放进去的那个。
-
直观的思路:一次遍历用哈希表记录盒子里的数,第二次遍历 n + 1 个数借助哈希表找到没出现过的那一个;
时间复杂度 O(n), 空间复杂度 O(n); -
进阶思路?
- Leetcode 191. 位1的个数
题目解读:给一个 32 位 int, 判断二进制表示中 1 的个数。
- 官解的巧妙思路:n & n - 1 这个操作总是能将 n 的最低位 1 变成 0,并且其它位不变,所以可以对 n 不断进行 & n - 1 的操作,直至 n == 0;
时间复杂度 O(logn), 空间复杂度 O(1);
- Leetcode 98. 验证二叉搜索树
题目解读:验证一个树是否是 BST。
- Acwing 的思路:题目描述中指明了分治法,只不过要注意递归的时候要传入上下界,否则可能会出现跨层不满足的情况;
时间复杂度 O(n), 空间复杂度 O(n),因为每个节点都要被检查一遍,递归深度最大达到 n 层;
- Leetcode 165. 比较版本号
题目解读:对比两个字符串,跳过中间一些无关字符。
- Acwing 的思路:双指针指向两个字符串开头,每次用另外两个指针来获取到有效的数字,然后对比继续,注意 substr 的参数还有 atoi 的参数函数 .c_str() 这个东西;
时间复杂度 O(n + m), 空间复杂度 O(1);
- Leetcode 23. 合并 K 个升序链表
题目解读:k 个升序链表合并成一个。
- 直观的思路:用 k 个指针指向开头,然后归并,但这种方法时间复杂度为 O(n * k);
- Acwing 的思路:使用单调队列 priority_queue 维护一个长度为 k 的小根堆,插入删除一个节点时间复杂度为O(logk),总体为 O(kn * logk),查找时间复杂度为 O(1),空间复杂度为 O(k);
网易
- Leetcode 121. 买卖股票的最佳时机
题目解读:最大子数组和
- 算法导论的思路:先将数组处理为变化量数组,然后用分治法,寻找最大子数组和。参考算法设计与分析 hws and labs;
时间复杂度:base case 下统计 lsum 与 rsum 需要 O(N), 递归 logN 层,总的是 O(NlogN);
空间复杂度:递归带来的系统调用 O(logN);
- Leetcode 1. 两数之和
题目解读:哈希表
- 直观的思路:一次遍历 + 哈希表记录已出现过的数;
时间复杂度:O(N);
空间复杂度:O(N);
- Leetcode 382. 链表随机节点
题目解读:要求概率都相同
- Acwing 的思路:蓄水池抽样法,从前到后,对于第 k 个数,让其被选中的概率为 1/k,那么最终它的概率就会是 1 / n,这里有一个巧妙的概率计算,官解中有;
时间复杂度:O(N),来自一次遍历;
空间复杂度:O(1);
- Leetcode 1545. 找出第 N 个二进制字符串中的第 K 位
题目解读:根据模式生成字符串,然后查找
- 官解的聪明思路:分治法,如果 k 在 mid 左侧直接查找上一层,如果 k 在 mid 右侧也查找上一层,只是位置换一下,然后结果取反;
时间复杂度:O(N), 字符串总长度 \(2^n - 1\),每次砍掉一半,总递归层数为 O(N);
空间复杂度:O(N),来自递归调用;
- Leetcode 135. 分发糖果
题目解读:给 n 个孩子发糖果,相邻孩子评分高的糖果数也必须更多
- 官解的思路:两个方向各遍历一次创建此方向上各个位置允许的最小分配数目,然后两个方向合起来取较小的。
时间复杂度:O(N);
空间复杂度:O(N); - Acwing 的思路:直接 dp,
f[x] = max(f[x], dp(x + 1) + 1, dp(x - 1) + 1)
时间复杂度:O(logN);
空间复杂度:O(logN);

浙公网安备 33010602011771号