Skip to content

yongqilei/leetcode

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Dedicated to leetcode

从 2022 年开始,我将做题的进度全都会移到我的个人网站上。

当中的解法可能不是最优解,就当作是找做题的感觉。

Daily Problems

Date Title Difficulty Category Finished Solution
2021/11/04 367. 有效的完全平方数 Easy 数学 ✔️ Solution(Python)
2021/11/06 268. 消失的数字 Easy 数组, 位运算 ✔️ Solution(Python)
2021/11/07 598. 范围求和 II Easy 数组 ✔️ Solution(Python)
2021/11/08 299. 猜数字游戏 Medium 数组 ✔️ Solution(Python), Solution(Go)
2021/11/09 488. 祖玛游戏 Hard TODO Solution(Python), Solution(Go)
2021/11/10 495. 提莫攻击 Easy 数组 ✔️ Solution(Python)
2021/11/11 629. K个逆序对数组 Hard 序列DP, 数组 ✔️ Solution(Python)
2021/11/12 375. 猜数字大小 II Medium 动态规划 ✔️ Solution(Go), Solution(Python)
2021/11/13 520. 检测大写字母 Easy 字符串 ✔️ Solution(Go)
2021/11/14 677. 键值映射 Medium 数据结构 ✔️ Solution(Java)
2021/11/15 319. 灯泡开关 Medium 数学 ✔️ Solution(Java)
2021/11/16 391. 完美矩形 Hard TODO
2021/11/17 318. 最大单词长度乘积 Medium  位运算 ✔️ Solution(Java), Solution(Python)
2021/11/18 563. 二叉树的坡度 Easy  二叉树, 后序遍历 ✔️ Solution(Java), Solution(Go), Solution(Python)
2021/11/19 397. 整数替换 Medium  DFS,动态规划 ✔️ Solution(Java), Solution(Go)
2021/11/20 594. 最长和谐子序列 Easy  枚举, Hash表 ✔️ Solution(Java)
2021/11/21 559. N 叉树的最大深度 Easy  递归 ✔️ Solution(Java)
2021/11/22 384. 打乱数组 Medium  Knuth算法, 洗牌算法 ✔️ Solution(Go)
2021/11/22 450. Delete Node in a BST Medium  BST, recursive ✔️ Solution(Java)
2021/11/23 859. 亲密字符串 Easy  字符串 ✔️ Solution(Go)
2021/11/24 423. 从英文中重建数字 Medium  矩阵 ✔️ Solution(Python), Solution(Java)
2021/11/25 458. 可怜的小猪 Hard 进制 ✔️ Solution(Go), Solution(Java)
2021/11/26 700. 二叉搜索树中的搜索 Easy BST, 递归 ✔️ Solution(Python), Solution(Java)
2021/11/28 438. 找到字符串中所有字母异位词 Medium 数组, 滑动窗口 ✔️ Solution(Java)
2021/11/29 786. 第 K 个最小的素数分数 Hard PriorityQueue ✔️ Solution(Java)
2021/11/30 400. 第 N 位数字 Medium 位数换算, 数学推理 ✔️ Solution(Java)
2021/12/01 1446. 连续字符 Easy 数组 ✔️ Solution(Java)
2021/12/02 506. 相对名次 Easy 数组 ✔️ Solution(Java)
2021/12/14 630. 课程表 III Hard 贪心算法, 优先级队列 ✔️ Solution(Java)
2021/12/17 1518. 换酒问题 Easy 乘除 ✔️ Solution(Java)
2021/12/23 1044. 最长重复子串 Hard 字符串哈希 ✔️ Solution(Java)
2021/12/25 1609. 奇偶树 Medium 二叉树层序遍历 ✔️ Solution(Java)
2021/12/26 1078. Bigram 分词 Easy 字符串 ✔️ Solution(Java)
2021/12/30 846. 一手顺子 Medium 模拟, 排序, 堆, 哈希计数 ✔️ Solution(Java)
2021/12/31 507. 完美数 Easy 模拟 ✔️ Solution(Java), Solution(Go)
2021/12/31 1026. Maximum Difference Between Node and Ancestor Medium 二叉树, 遍历, 左右子树最大差异 ✔️ Solution(Java)
2022/01/02 390. 消除游戏 Medium 数学, 约瑟夫环 ✔️ Solution(Java)
2022/01/02 1010. Pairs of Songs With Total Durations Divisible by 60 Medium TwoSum.. ✔️ Solution(Java)
2022/01/03 1185. 一周中的第几天 Easy 模拟年份 ✔️ Solution(Java)
2022/01/03 997. Find the Town Judge Easy 数组 ✔️ Solution(Java)
2022/01/06 71. 简化路径 Medium 字符串模拟 ✔️ Solution(Java)
2022/01/07 1614. 括号的最大嵌套深度 Easy 字符串 ✔️ Solution(Java)
2022/01/07 382. Linked List Random Node Medium 随机访问, 水塘抽样, Reservoir Sampling ✔️ Solution(Java)

Leetcode Roadmap

Title Difficulty Category Finished Solution
124. 二叉树中的最大路径和 Hard 二叉树, 后序遍历 TODO
105. 从前序与中序遍历序列构造二叉树 Medium 二叉树, 中序遍历, 前序遍历 ✔️ Solution(Python), Solution(Go)
99. 恢复二叉搜索树 Medium 二叉树, 中序遍历 ✔️ Solution(Python), Solution(Go)
96. 不同的二叉搜索树 Medium 二叉搜索树 ✔️ Solution, Solution(Java)
104. 二叉树的最大深度 Easy 二叉树 ✔️ Solution(Python), Solution(Go)
322. 零钱兑换 Medium 动态规划 ✔️ Solution(Go)
46. 全排列 Medium 动态规划 ✔️ Solution(Java)
51. N 皇后 Hard 回溯 ✔️ Solution(Python), Solution(Java)
3. 无重复字符的最长子串 Medium 滑动窗口 ✔️ Solution(Java), Solution(Go), Solution(Python)
11. 盛最多水的容器 Medium 数组, 双指针 ✔️ Solution(Java), Solution(Go), Solution(Python)
551. 学生出勤记录 I Easy 数据结构,字符串 ✔️ Solution(Java)
983. 最低票价 Medium 动态规划(与零钱兑换相似) ✔️ Solution(Java)
55. 跳跃游戏 Medium 动态规划 ✔️ Solution(Java), Solution(Python)
62. 不同路径 Medium 动态规划 ✔️ Solution(Java)
63. 不同路径 II Medium 动态规划 ✔️ Solution(Java)
279. 完全平方数 Medium 动态规划 ✔️ Solution(Java)
121. 买卖股票的最佳时机 Easy 动态规划 ✔️ Solution(Java)
122. 买卖股票的最佳时机 II Medium 动态规划 ✔️ Solution(Java)
123. 买卖股票的最佳时机 III Hard 动态规划 ✔️ Solution(Java), Solution(Python)
22. 括号生成 Medium DFS ✔️ Solution(Java)
198. 打家劫舍 Medium 动态规划 ✔️ Solution(Java)
213. 打家劫舍 II Medium 动态规划 ✔️ Solution(Java)
221. 最大正方形 Medium 动态规划 ✔️ Solution(Java)
152. 乘积最大子数组 Medium 动态规划 ✔️ Solution(Java)
5. 最长回文子串 Medium 动态规划, 暴力搜索 ✔️ Solution(Java)
206. 反转链表 Easy 递归 ✔️ Solution(Go)
92. 反转链表 II Medium 递归 ✔️ Solution(Java)
1218. 最长定差子序列 Medium 动态规划 ✔️ Solution(Java)
53. 最大子序和 Easy 动态规划 ✔️ Solution(Java)
918. 环形子数组的最大和 Easy 最小子序和, 最大子序和 ✔️ Solution(Java)
127. 单词接龙 Hard BFS, 双向BFS ✔️ Solution(Java)
207. 课程表 Medium 有向无环图(DAG) ✔️ Solution(Java), Solution(Python)
210. 课程表 II Medium 有向无环图(DAG) ✔️ Solution(Java)
8. 字符串转换整数 (atoi) Medium 字符串, 数组 ✔️ Solution(Java), Solution(Java) 2
15. 三数之和 Medium 双指针, 排序 ✔️ Solution(Java), Solution(Go)
109. Convert Sorted List to Binary Search Tree Medium BST, 中序遍历 ✔️ Solution(Java)
52. N皇后 II Hard 回溯 ✔️ Solution(Java)
200. Number of Islands Medium BFS ✔️ Solution(Java)
2. Add Two Numbers Medium 链表 ✔️ Solution(Java)
3. Longest Substring Without Repeating Characters Medium 字符串, 双指针 ✔️ Solution(Java)
5. Longest Palindromic Substring Medium 回文串 ✔️ Solution(Java)
7. Reverse Integer Medium 数学 ✔️ Solution(Java)
34. Find First and Last Position of Element in Sorted Array Medium Binary Search ✔️ Solution(Java) O(n), Solution(Java) O(log(n))
7. 整数反转 Medium 数学 ✔️ Solution(Java)

剑指 Offer II

Title Difficulty Category Finished Solution
剑指 Offer II 001. 整数除法 Easy 位运算 ✔️ Solution(Python)
剑指 Offer II 002. 二进制加法 Easy 位运算, 数学, 字符串 ✔️ Solution(Python)
剑指 Offer II 003. 前 n 个数字二进制中 1 的个数 Easy 位运算, 数学, 递归 ✔️ Solution(Go)
剑指 Offer 30. 包含min函数的栈 Easy 栈, 数组 ✔️ Solution(Go)
剑指 Offer II 004. 只出现一次的数字 Medium Hash表 ✔️ Solution(Go)
剑指 Offer II 005. 单词长度的最大乘积 Medium 位运算 ✔️ Solution(Go)
剑指 Offer II 006. 排序数组中两个数字之和 Easy Hash表 ✔️ Solution(Go)
剑指 Offer II 007. 数组中和为 0 的三个数 Medium 双指针 ✔️ Solution(Python)
剑指 Offer II 008. 和大于等于 target 的最短子数组 Medium 二分查找, 前缀和; 滑动窗口 ✔️ Solution(Java)
剑指 Offer II 009. 乘积小于 K 的子数组 Medium 滑动窗口 ✔️ Solution(Go)
剑指 Offer II 010. 和为 k 的子数组 Medium 前缀和+HashTable ✔️ Solution(Java), Solution(Go)
剑指 Offer II 011. 0 和 1 个数相同的子数组 Medium 前缀和+HashTable ✔️ Solution(Java)
剑指 Offer II 012. 左右两边子数组的和相等 Easy 前缀和 ✔️ Solution(Java)
剑指 Offer II 013. 二维子矩阵的和 Medium 二维数组前缀和 ✔️ Solution(Java)
剑指 Offer II 030. 插入、删除和随机访问都是 O(1) 的容器 Medium 数据结构, Hash表, 链表 ✔️ Solution(Java)

题解

629. K个逆序对数组(题解)

Hard难度,该题为典型的序列DP类型的题

假设 dp[i][j] 为考虑了 [1, i]i 个数字,逆序对为 j 的方案数

3. 无重复字符的最长子串(题解)

Medium 难度,使用滑动窗口可以解决

字符串的字母从左往右一个一个包括进滑动窗口,并将每个字符和其索引用Map存放起来。使用 left 字段记录窗口最左端。

当遇到了之前遇到过的字符,即遇到重复字符,则将此时的长度与前一次滑动窗口长度比较取大的值(ans = max(ans, i - left + 1)),并且将left索引设置为当前这次重复的字符的索引 + 1,并将该字符的索引替换成重复字符的索引(较大索引)。

知道循环结束,返回 ans 为最大不重复子串长度。

983. 最低票价(题解)

Medium 难度,稍微有一些变化的动态规划

这道题需要我们变换一下动态规划的思路,从后往前做动态规划。

123. 买卖股票的最佳时机 III(题解)

Hard 难度,稍微比较难想出状态转移方程。如果找到状态转移方程,则很容易解决。

因为这道题限制我们最多交易两次,所以我们创建四个变量(buy1, sell1, buy2, sell2)分别代表(第一回购买股票时的最大收益,第一回卖出股票时的最大收益,第二回购买股票时的最大收益,第二回卖出股票时的最大收益)。这时候就要找出这四个变量之间的关系以及4各变量间的状态是如何转移的(这部分应该算是比较难的部分了)。

从字面意思上可以看出,sell2 = max(sell2, buy2 + 当前售卖天的股票价格), buy2 = (buy2, 第一回售卖股票的最大收益 - 当前售卖天的股票价格), sell1 = max(sell1, buy1 + 当前售卖天的股票价格), buy1 = max(buy1, 0-当前售卖天的股票价格)

也就是说我们需要找出第一次买卖股票的最大收益和第二次买卖股票的最大收益。

假设第一天购入股票,我们可以初始化四个变量的初始状态:buy1 = -prices[0] (因为第一次购入,收益会是负数), sell1 = 0(还没有卖出过股票,所以卖出时收益初始化为0), buy2 = -prices[0] (和buy1解释一样,因为有可能只有一次交易), sell2 = 0。

根据以上的分析,我们就能写出对应的代码了:

public int maxProfit(int[] prices) {
    int buy1 = -prices[0], sell1 = 0;
    int buy2 = -prices[0], sell2 = 0;
    for (int i = 1; i < prices.length; i++) {
        buy1 = Math.max(buy1, -prices[i]);
        sell1 = Math.max(sell1, buy1 + prices[i]);
        buy2 = Math.max(buy2, sell1 - prices[i]);
        sell2 = Math.max(sell2, buy2 + prices[i]);
    }
    return sell2;
}

450. Delete Node in a BST - Medium

这道题是国外站的 2021/11/22 每日一题,中等难度,主要考察对二叉搜索树的熟悉程度

从题解可以看出来这是一道二叉搜索树的题,针对树这类题,我们首先能想到的解法就是递归。

当我们删除一个节点时,该怎么重构才能让其保持为二叉搜索树呢?这里可以列举出三种情况:

  • 需要删除的节点没有左子树但存在右子树:

我们可以简单的将该节点替换为右节点。

  • 需要删除的节点没有右子树但存在左子树: 简单的将该节点替换为左节点。

  • 需要删除的节点既存在左子树也存在右子树:

如果左右子节点都存在的情况,咱们看一下下面这张图,大家应该都能找到规律:

Image1

如果要删除上图中值为15的节点,则需要将它的右节点中的左子树中的最小值替换上来,这样我们就能保持一个完整的二叉搜索树。找到规律后,我们就可以写出来代码了:

public TreeNode deleteNode(TreeNode root, int key) {
    if (root == null) {
        return root;
    }
    if (key < root.val) {
        root.left = deleteNode(root.left, key);
        return root;
    }
    if (key > root.val) {
        root.right = deleteNode(root.right, key);
        return root;
    }
    if (root.left == null) {
        return root.right;
    }
    if (root.right == null) {
        return root.left;
    }
    TreeNode min = root.right;
    while (min.left != null) {
        min = min.left;
    }
    root.val = min.val;
    root.right = deleteNode(root.right, min.val);
    return root;
}

786. 第 K 个最小的素数分数 - Hard

剑指 Offer II 013. 二维子矩阵的和

Medium - 主要用到了Prefix Sum思路,关键是如何找出前缀和数组中各项的关系

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published