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 企业经典面试题

快手

  1. Leetcode 268. 丢失的数字
    题目解读:n + 1 个数字放在 n 个盒子里,找到没有被放进去的那个。
  • 直观的思路:一次遍历用哈希表记录盒子里的数,第二次遍历 n + 1 个数借助哈希表找到没出现过的那一个;
    时间复杂度 O(n), 空间复杂度 O(n);

  • 进阶思路?


  1. Leetcode 191. 位1的个数
    题目解读:给一个 32 位 int, 判断二进制表示中 1 的个数。
  • 官解的巧妙思路:n & n - 1 这个操作总是能将 n 的最低位 1 变成 0,并且其它位不变,所以可以对 n 不断进行 & n - 1 的操作,直至 n == 0;
    时间复杂度 O(logn), 空间复杂度 O(1);

  1. Leetcode 98. 验证二叉搜索树
    题目解读:验证一个树是否是 BST。
  • Acwing 的思路:题目描述中指明了分治法,只不过要注意递归的时候要传入上下界,否则可能会出现跨层不满足的情况;
    时间复杂度 O(n), 空间复杂度 O(n),因为每个节点都要被检查一遍,递归深度最大达到 n 层;

  1. Leetcode 165. 比较版本号
    题目解读:对比两个字符串,跳过中间一些无关字符。
  • Acwing 的思路:双指针指向两个字符串开头,每次用另外两个指针来获取到有效的数字,然后对比继续,注意 substr 的参数还有 atoi 的参数函数 .c_str() 这个东西;
    时间复杂度 O(n + m), 空间复杂度 O(1);

  1. Leetcode 23. 合并 K 个升序链表
    题目解读:k 个升序链表合并成一个。
  • 直观的思路:用 k 个指针指向开头,然后归并,但这种方法时间复杂度为 O(n * k);
  • Acwing 的思路:使用单调队列 priority_queue 维护一个长度为 k 的小根堆,插入删除一个节点时间复杂度为O(logk),总体为 O(kn * logk),查找时间复杂度为 O(1),空间复杂度为 O(k);

网易

  1. Leetcode 121. 买卖股票的最佳时机
    题目解读:最大子数组和
  • 算法导论的思路:先将数组处理为变化量数组,然后用分治法,寻找最大子数组和。参考算法设计与分析 hws and labs;
    时间复杂度:base case 下统计 lsum 与 rsum 需要 O(N), 递归 logN 层,总的是 O(NlogN);
    空间复杂度:递归带来的系统调用 O(logN);

  1. Leetcode 1. 两数之和
    题目解读:哈希表
  • 直观的思路:一次遍历 + 哈希表记录已出现过的数;
    时间复杂度:O(N);
    空间复杂度:O(N);

  1. Leetcode 382. 链表随机节点
    题目解读:要求概率都相同
  • Acwing 的思路:蓄水池抽样法,从前到后,对于第 k 个数,让其被选中的概率为 1/k,那么最终它的概率就会是 1 / n,这里有一个巧妙的概率计算,官解中有;
    时间复杂度:O(N),来自一次遍历;
    空间复杂度:O(1);

  1. Leetcode 1545. 找出第 N 个二进制字符串中的第 K 位
    题目解读:根据模式生成字符串,然后查找
  • 官解的聪明思路:分治法,如果 k 在 mid 左侧直接查找上一层,如果 k 在 mid 右侧也查找上一层,只是位置换一下,然后结果取反;
    时间复杂度:O(N), 字符串总长度 \(2^n - 1\),每次砍掉一半,总递归层数为 O(N);
    空间复杂度:O(N),来自递归调用;

  1. 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);

posted @ 2023-03-26 12:07  ImproperMelon  阅读(44)  评论(0)    收藏  举报