czy0538 / leetcode-2022

my leetcode records, starting at 2022-10-30

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

leetcode-2022

目标:一天一道,同时用go和c++实现

刷题记录

数组

  1. 数组过于简单,但你该了解这些! (2022年10月30日)

  2. 数组:二分查找(2022年10月30日)

    二分查找最重要的就是思考清楚是“左闭右开还是左闭右闭,这取决于有变量是否有意义,有意义这应该是左闭右闭,此时r应该始终有意义,且改变r时不能再+1

    二分查找全部统一到 acwing 的模版上来!。

    • 704 二分查找(2022年10月30日,2023年07月06日)

    • 35.搜索插入位置(2022年10月31日,2023年07月08日)

      要搞清楚到底i是取上还是取下,比如左闭右闭,就要取上,左闭右开,就要取下

    • 34.在排序数组中查找元素的第一个和最后一个位置(2022年11月01日,2023年07月06日)

    • 69.x 的平方根(2022年11月02日)

    • 367.有效的完全平方数(2022年11月03日)使用c++时注意防止溢出

  3. 数组:移除元素

    • 27. 移除元素【快慢指针】(2022年11月04日)

    • 26.删除排序数组中的重复项(2022年11月05日)

      c++的stl unique就是干这个的

      class Solution {
      public:
          int removeDuplicates(vector<int>& nums) {
              auto iter = unique(nums.begin(), nums.end());
              return iter - nums.begin();
          }
      };

      非常的快,但是还是双指针更通用。

    • 283.移动零(2022年11月06日)

    • 844.比较含退格的字符串(2022年11月07日,2023年04月22日)📌

      用栈非常简单,但是考虑下不用栈原地的方法

      正着走感觉比较困难,因为你很难判断要走多少才能确保没有#,如果找到头那时间复杂度就成了$O(n^2)$,比较极端的情况例如前半段都是字符,后半段全是#就很惨。所以从后往前会好一些,因为这样是先看到删除再看到字符。这个用双指针比较困难,考虑的细节很多,需要再巩固。

      这个简单题并不简单,需要谨慎的去思考退格的情况,特别要注意,退格是不能删除退格的。

      "bxj##tw"
      "bxo#j##tw"
      "bbbextm"
      "bbb#extm"
      "bxj##tw"
      "bxj###tw"
      
    • 977.有序数组的平方(2022年11月08日)

  4. 数组:序数组的平方 (2022年11月08日)

  5. 数组:长度最小的子数组滑动窗口问题(2022年11月9日)

  6. 数组:螺旋矩阵II(2022年11月14日,:pushpin:)

    • 54.螺旋矩阵(2022年11月15日,:pushpin:)

    • 剑指Offer 29.顺时针打印矩阵(2022年11月16日)

  7. 数组:总结篇

链表

  1. 关于链表,你该了解这些!
  2. 链表:移除链表元素(2022年11月17日)
  3. 链表:设计链表(2022年11月18日)

双指针法:

  1. 链表:翻转链表 (2022年11月19日)

  2. 链表:两两交换链表中的节点(2022年11月20日)

  3. 链表:删除链表的倒数第 N 个结点(2022年11月21日)

  4. 链表:链表相交(2022年11月22日)

  5. 141. 环形链表(2022年11月23日,:pushpin:,2023年07月11日)

  6. 链表:环形链表(2022年11月24日,:pushpin:)

    从头结点出发一个指针,从相遇节点 也出发一个指针,这两个指针每次只走一个节点, 那么当这两个指针相遇的时候就是 环形入口的节点。这个代码不难,但是**很有意思,应该要记住。

  7. 链表:总结篇!

哈希表

  1. 关于哈希表,你该了解这些!
  2. 哈希表:有效的字母异位词(2022年11月25日)
  3. 哈希表:查找常用字符(2022年11月26日)
  4. 哈希表:两个数组的交集(2022年11月28日)
  5. 哈希表:快乐数(2022年11月29日)
  6. 哈希表:两数之和(2022年12月05日)
  7. 哈希表:四数相加II(2022年12月06日,:pushpin:,2023年07月13日)
  8. 哈希表:赎金信(2022年12月07日)
  9. 哈希表:三数之和(2022年12月16日,:pushpin:,2023年07月09日)
  10. 双指针法:四数之和
  11. 哈希表:总结篇!

字符串

  1. 字符串:反转字符串(2022年12月27日)
  2. 字符串:反转字符串II(2023年02月15日)
  3. 字符串:替换空格(2023年02月16日)
  4. 字符串:翻转字符串里的单词(2023年02月17日)
  5. 字符串:左旋转字符串(2023年02月18日)
  6. 帮你把KMP算法学个通透
  7. 字符串:重复的子字符串
  8. 字符串:总结篇!

双指针法

双指针法基本都是应用在数组,字符串与链表的题目上

  1. 数组:移除元素(2023年02月20日,2023年07月16日)
  2. 字符串:反转字符串(2022年12月27日)
  3. 字符串:替换空格(2023年02月21日)
  4. 字符串:翻转字符串里的单词(2023年02月17日)
  5. 链表:翻转链表(2023年02月22日)
  6. 链表:删除链表的倒数第 N 个结点(2023年02月22日)
  7. 链表:链表相交
  8. 链表:环形链表
  9. 双指针:三数之和
  10. 双指针:四数之和
  11. 双指针:总结篇!

栈与队列

  1. 栈与队列:来看看栈和队列不为人知的一面(2023年02月23日)
  2. 栈与队列:用栈实现队列(2023年02月23日)
  3. 栈与队列:用队列实现栈(2023年02月24日)
  4. 栈与队列:有效的括号(2023年02月27日)
  5. 栈与队列:删除字符串中的所有相邻重复项(2023年02月28日)
  6. 栈与队列:逆波兰表达式求值(2023年03月01日)
  7. 栈与队列:滑动窗口最大值(2023年03月06日,:pushpin:)
  8. 栈与队列:前K个高频元素(2023年03月07日,:pushpin:,主要是优先队列的写法)
  9. 栈与队列:总结篇!

二叉树

题目分类大纲如下: 二叉树大纲

  1. 关于二叉树,你该了解这些!
  2. 二叉树:二叉树的递归遍历(2023年03月12日)
  3. 二叉树:二叉树的迭代遍历(2023年03月13日)
  4. 二叉树:二叉树的统一迭代法
  5. 二叉树:二叉树的层序遍历 (3.15-3.18)
  6. 二叉树:翻转二叉树 (2023年03月20日)
  7. 本周小结!(二叉树)
  8. 二叉树:对称二叉树(2023年03月21日-2023年03月22日)
  9. 二叉树:二叉树的最大深度(2023年03月23日)
  10. 二叉树:二叉树的最小深度(2023年03月23日)
  11. 二叉树:完全二叉树的节点个数(2023年03月24日)
  12. 二叉树:平衡二叉树(2023年03月24日)
  13. 二叉树:二叉树的所有路径(2023年03月27日)
  14. 本周总结!二叉树系列二
  15. 二叉树:二叉树中递归带着回溯
  16. 二叉树:左叶子之和(2023年03月28日)
  17. 二叉树:找树左下角的值(2023年03月29日)
  18. 二叉树:路径总和(2023年03月29日)(2023年04月20日)(2023年04月21日)
  19. 二叉树:构造二叉树(2023年03月30日)
  20. 二叉树:最大二叉树(2023年03月31日)
  21. 本周小结!(二叉树系列三)
  22. 二叉树:合并两个二叉树(2023年04月01日) 二叉搜索树的中序遍历就是一个升序的数组。
  23. 二叉树:二叉搜索树登场!(2023年04月01日)
  24. 二叉树:验证二叉搜索树(2023年04月02日)
  25. 二叉树:搜索树的最小绝对差(2023年04月02日)
  26. 二叉树:二叉搜索树中的众数(2023年04月03日, 📌)
  27. 二叉树:公共祖先问题(2023年04月04日)
  28. 本周小结!(二叉树系列四)
  29. 二叉树:搜索树的最近公共祖先(2023年04月04日)
  30. 二叉树:搜索树中的插入操作(2023年04月05日)
  31. 二叉树:搜索树中的删除操作(2023年04月06日)
  32. 二叉树:修剪一棵搜索树(2023年04月06日)
  33. 二叉树:构造一棵搜索树(2023年04月07日) 附加. 二叉树:二叉树的序列化与反序列化(2023年04月10日)
  34. 二叉树:搜索树转成累加树(2023年04月11日)
  35. 二叉树:总结篇!(需要掌握的二叉树技能都在这里了)

csview 补充题目

  1. 二叉树的完全性检验(2023年04月13日)
  2. 662. 二叉树最大宽度(2023年04月14日)
  3. 226. 翻转二叉树(2023年04月15日)
  4. 572. 另一棵树的子树(2023年04月15日)
  5. 230. 二叉搜索树中第K小的元素(2023年04月15日,,2023年04月24日)
  6. 103. 二叉树的锯齿形层序遍历(2023年04月16日)
  7. 199. 二叉树的右视图(2023年04月17日)
  8. 124. 二叉树中的最大路径和(2023年04月18日)
  9. 543. 二叉树的直径(2023年04月19日)
  10. 129. 求根节点到叶节点数字之和(2023年04月20日)
  11. 剑指 Offer 54. 二叉搜索树的第k大节点(2023年04月22日)

回溯算法

题目分类大纲如下:

回溯算法大纲

  1. 关于回溯算法,你该了解这些!

  2. 回溯算法:组合问题(2023年04月12日)

  3. 回溯算法:组合问题再剪剪枝(2023年04月12日)

  4. 回溯算法:求组合总和!(2023年05月02日)

  5. 回溯算法:电话号码的字母组合(2023年05月03日)

  6. 本周小结!(回溯算法系列一)

  7. 回溯算法:求组合总和(二)(2023年05月04日)

  8. 回溯算法:求组合总和(三)(2023年05月05日,:pushpin:,2023年05月15日)

  9. 回溯算法:分割回文串(2023年05月06日,简单方法,:pushpin:)

  10. 回溯算法:复原IP地址(2023年05月08日,:pushpin:,2023年06月06日,:pushpin:,2023年06月07日)

  11. 回溯算法:求子集问题!(2023年05月09日)

  12. 本周小结!(回溯算法系列二)

  13. 回溯算法:求子集问题(二)(2023年05月10日)

  14. 回溯算法:递增子序列(2023年05月12日)

    回溯算法的去重问题的总结:去重主要是同层去重,即广度去重,深度不用去重。

    大体上分为可排序问题和不可排序问题。

    对于可排序问题的去重,需要先对输入进行排序,然后在 for 循环处,判断该元素与上个元素是否相等。

    for (auto it = beg; it < end; it++) {
                if (it != beg && *(it - 1) == *it) {
                    continue;
                }
      // ...
    }
    
    sort(nums.begin(),nums.end());

    对于不可排序的,如该题,如果范围给出了,那么可以用数组,效率会高。注意是同层去重,因此不需要 pop 啥的。

    			  array<bool, 201> used{};
            for (auto it = beg; it < end; it++) {
                if (used[*it+100] || (!path.empty() && *it < path.back())) {
                    continue;
                }
                path.push_back(*it);
                used[*it + 100] = true;
                if (path.size() > 1) {
                    result.push_back(path);
                }
                backtracing(it + 1, end);
                path.pop_back();
            }
        }
    

    而如果范围也没有给出,就只能用unordered_set了。

             unordered_set<int> used;
             for (auto it = beg; it < end; it++) {
                 if (used.find(*it)!=used.end() || (!path.empty()&&*it < path.back())) {
                     continue;
                 }
                 path.push_back(*it);
                 used.insert(*it);
                 if (path.size() > 1) {
                     result.push_back(path);
                 }
                 backtracing(it + 1, end);
                 path.pop_back();
             }
         }
  15. 回溯算法:排列问题!(2023年05月13日)

  16. 回溯算法:排列问题(二)(2023年05月14日,:pushpin:,2023-06-05)

    可以想象填格子的过程,横向是决定这个空填多少,填过了的肯定不能再填。

    纵向是决定是填第几个空。

  17. 本周小结!(回溯算法系列三)

  18. 回溯算法去重问题的另一种写法

  19. 回溯算法:重新安排行程(2023年05月31日,:pushpin:,2023年06月01日)

  20. 回溯算法:N皇后问题(2023年06月02日)

  21. 回溯算法:解数独(2023年06月03日,:pushpin:,2023年06月04日)

  22. 一篇总结带你彻底搞透回溯算法!

贪心算法

题目分类大纲如下:

贪心算法大纲

  1. 关于贪心算法,你该了解这些!
  2. 贪心算法:分发饼干(2023年06月08日)
  3. 贪心算法:摆动序列(2023年06月09日,:pushpin:,2023年06月26日)
  4. 贪心算法:最大子序和(2023年06月10日)
  5. 本周小结!(贪心算法系列一)
  6. 贪心算法:买卖股票的最佳时机II(2023年06月11日)
  7. 贪心算法:跳跃游戏(2023年06月11日)
  8. 贪心算法:跳跃游戏II(2023年06月12日,:pushpin:,2023年06月26日,:pushpin:)
  9. 贪心算法:K次取反后最大化的数组和(2023年06月13日)
  10. 本周小结!(贪心算法系列二)
  11. 贪心算法:加油站(2023年06月14日,:pushpin:)
  12. 贪心算法:分发糖果(2023年06月15日,multimap没有贪心)
  13. 贪心算法:柠檬水找零(2023年06月16日)
  14. 贪心算法:根据身高重建队列(2023年06月19日)
  15. 本周小结!(贪心算法系列三)
  16. 贪心算法:根据身高重建队列(续集)
  17. 贪心算法:用最少数量的箭引爆气球(2023年06月20日)
  18. 贪心算法:无重叠区间(2023年06月21日)
  19. 贪心算法:划分字母区间(2023年06月22日,:pushpin:)
  20. 贪心算法:合并区间(2023年06月23日)
  21. 本周小结!(贪心算法系列四)
  22. 贪心算法:单调递增的数字(2023年06月24日,:pushpin:)
  23. 贪心算法:买卖股票的最佳时机含手续费(2023年06月25日,:pushpin:)
  24. 贪心算法:我要监控二叉树!
  25. 贪心算法:总结篇!(每逢总结必经典)

动态规划

动态规划专题已经开始啦,来不及解释了,小伙伴们上车别掉队!

  1. 关于动态规划,你该了解这些!
  2. 动态规划:斐波那契数
  3. 动态规划:爬楼梯
  4. 动态规划:使用最小花费爬楼梯
  5. 本周小结!(动态规划系列一)
  6. 动态规划:不同路径
  7. 动态规划:不同路径还不够,要有障碍!
  8. 动态规划:整数拆分,你要怎么拆?
  9. 动态规划:不同的二叉搜索树
  10. 本周小结!(动态规划系列二)

背包问题系列:

背包问题大纲

  1. 动态规划:关于01背包问题,你该了解这些!
  2. 动态规划:关于01背包问题,你该了解这些!(滚动数组)
  3. 动态规划:分割等和子集可以用01背包!
  4. 动态规划:最后一块石头的重量 II
  5. 本周小结!(动态规划系列三)
  6. 动态规划:目标和!
  7. 动态规划:一和零!
  8. 动态规划:关于完全背包,你该了解这些!
  9. 动态规划:给你一些零钱,你要怎么凑?
  10. 本周小结!(动态规划系列四)
  11. 动态规划:Carl称它为排列总和!
  12. 动态规划:以前我没得选,现在我选择再爬一次!
  13. 动态规划: 给我个机会,我再兑换一次零钱
  14. 动态规划:一样的套路,再求一次完全平方数
  15. 本周小结!(动态规划系列五)
  16. 动态规划:单词拆分
  17. 动态规划:关于多重背包,你该了解这些!
  18. 听说背包问题很难? 这篇总结篇来拯救你了

打家劫舍系列:

  1. 动态规划:开始打家劫舍!
  2. 动态规划:继续打家劫舍!
  3. 动态规划:还要打家劫舍!

股票系列:

股票问题总结

  1. 动态规划:买卖股票的最佳时机
  2. 动态规划:本周我们都讲了这些(系列六)
  3. 动态规划:买卖股票的最佳时机II
  4. 动态规划:买卖股票的最佳时机III
  5. 动态规划:买卖股票的最佳时机IV
  6. 动态规划:最佳买卖股票时机含冷冻期
  7. 动态规划:本周我们都讲了这些(系列七)
  8. 动态规划:买卖股票的最佳时机含手续费
  9. 动态规划:股票系列总结篇

子序列系列:

  1. 动态规划:最长递增子序列
  2. 动态规划:最长连续递增序列
  3. 动态规划:最长重复子数组
  4. 动态规划:最长公共子序列
  5. 动态规划:不相交的线
  6. 动态规划:最大子序和
  7. 动态规划:判断子序列
  8. 动态规划:不同的子序列
  9. 动态规划:两个字符串的删除操作
  10. 动态规划:编辑距离
  11. 为了绝杀编辑距离,Carl做了三步铺垫,你都知道么?
  12. 动态规划:回文子串
  13. 动态规划:最长回文子序列
  14. 动态规划总结篇

单调栈

  1. 单调栈:每日温度
  2. 单调栈:下一个更大元素I
  3. 单调栈:下一个更大元素II
  4. 单调栈:接雨水
  5. 单调栈:柱状图中最大的矩形

(持续更新中....)

图论

十大排序

数论

高级数据结构经典题目

  • 并查集
  • 最小生成树
  • 线段树
  • 树状数组
  • 字典树

海量数据处理

补充题目

以上题目是重中之重,大家至少要刷两遍以上才能彻底理解,如果熟练以上题目之后还在找其他题目练手,可以再刷以下题目:

这些题目很不错,但有的题目是和刷题攻略类似的,有的题解后面还会适当补充,所以我还没有将其纳入到刷题攻略。一些题解等日后我完善一下,再纳入到刷题攻略。

数组

链表

哈希表

字符串

二叉树

回溯算法

贪心

动态规划

图论

并查集

模拟

位运算

其他题目

About

my leetcode records, starting at 2022-10-30


Languages

Language:C++ 80.5%Language:Go 18.5%Language:Shell 0.9%Language:C 0.1%