541~1382连接合并+commit之前 gitpull

This commit is contained in:
XuDaHaoRen
2021-08-24 13:11:57 +08:00
parent 059b5471cd
commit 8c748680f1
37 changed files with 97 additions and 155 deletions

View File

@ -8,7 +8,7 @@
## 583. 两个字符串的删除操作
题目链接:https://leetcode-cn.com/problems/delete-operation-for-two-strings/
[力扣题目链接](https://leetcode-cn.com/problems/delete-operation-for-two-strings/)
给定两个单词 word1 和 word2找到使得 word1 和 word2 相同所需的最小步数,每步可以删除任意一个字符串中的一个字符。
@ -20,7 +20,7 @@
## 思路
本题和[动态规划115.不同的子序列](https://mp.weixin.qq.com/s/1SULY2XVSROtk_hsoVLu8A)相比,其实就是两个字符串可以都可以删除了,情况虽说复杂一些,但整体思路是不变的。
本题和[动态规划115.不同的子序列](https://programmercarl.com/0115.不同的子序列.html)相比,其实就是两个字符串可以都可以删除了,情况虽说复杂一些,但整体思路是不变的。
这次是两个字符串可以相互删了,这种题目也知道用动态规划的思路来解,动规五部曲,分析如下:

View File

@ -9,7 +9,7 @@
## 617.合并二叉树
题目地址:https://leetcode-cn.com/problems/merge-two-binary-trees/
[力扣题目链接](https://leetcode-cn.com/problems/merge-two-binary-trees/)
给定两个二叉树,想象当你将它们中的一个覆盖到另一个上时,两个二叉树的一些节点便会重叠。
@ -165,7 +165,7 @@ public:
使用迭代法,如何同时处理两棵树呢?
思路我们在[二叉树:我对称么?](https://mp.weixin.qq.com/s/Kgf0gjvlDlNDfKIH2b1Oxg)中的迭代法已经讲过一次了,求二叉树对称的时候就是把两个树的节点同时加入队列进行比较。
思路我们在[二叉树:我对称么?](https://programmercarl.com/0101.对称二叉树.html)中的迭代法已经讲过一次了,求二叉树对称的时候就是把两个树的节点同时加入队列进行比较。
本题我们也使用队列,模拟的层序遍历,代码如下:
@ -245,7 +245,7 @@ public:
合并二叉树,也是二叉树操作的经典题目,如果没有接触过的话,其实并不简单,因为我们习惯了操作一个二叉树,一起操作两个二叉树,还会有点懵懵的。
这不是我们第一次操作两颗二叉树了,在[二叉树:我对称么?](https://mp.weixin.qq.com/s/Kgf0gjvlDlNDfKIH2b1Oxg)中也一起操作了两棵二叉树。
这不是我们第一次操作两颗二叉树了,在[二叉树:我对称么?](https://programmercarl.com/0101.对称二叉树.html)中也一起操作了两棵二叉树。
迭代法中,一般一起操作两个树都是使用队列模拟类似层序遍历,同时处理两个树的节点,这种方式最好理解,如果用模拟递归的思路的话,要复杂一些。

View File

@ -8,7 +8,7 @@
## 647. 回文子串
题目链接:https://leetcode-cn.com/problems/palindromic-substrings/
[力扣题目链接](https://leetcode-cn.com/problems/palindromic-substrings/)
给定一个字符串,你的任务是计算这个字符串中有多少个回文子串。

View File

@ -67,7 +67,7 @@ Dota2 参议院由来自两派的参议员组成。现在参议院希望对一
局部最优可以退出全局最优,举不出反例,那么试试贪心。
如果对贪心算法理论基础还不了解的话,可以看看这篇:[关于贪心算法,你该了解这些!](https://mp.weixin.qq.com/s/O935TaoHE9Eexwe_vSbRAg) ,相信看完之后对贪心就有基本的了解了。
如果对贪心算法理论基础还不了解的话,可以看看这篇:[关于贪心算法,你该了解这些!](https://programmercarl.com/贪心算法理论基础.html) ,相信看完之后对贪心就有基本的了解了。
# 代码实现

View File

@ -9,7 +9,7 @@
## 654.最大二叉树
题目地址:https://leetcode-cn.com/problems/maximum-binary-tree/
[力扣题目地址](https://leetcode-cn.com/problems/maximum-binary-tree/)
给定一个不含重复元素的整数数组。一个以此数组构建的最大二叉树定义如下:
@ -143,7 +143,7 @@ public:
以上代码比较冗余效率也不高每次还要切割的时候每次都要定义新的vector也就是数组但逻辑比较清晰。
和文章[二叉树:构造二叉树登场!](https://mp.weixin.qq.com/s/7r66ap2s-shvVvlZxo59xg)中一样的优化思路,就是每次分隔不用定义新的数组,而是通过下表索引直接在原数组上操作。
和文章[二叉树:构造二叉树登场!](https://programmercarl.com/0106.从中序与后序遍历序列构造二叉树.html)中一样的优化思路,就是每次分隔不用定义新的数组,而是通过下表索引直接在原数组上操作。
优化后代码如下:
@ -212,7 +212,7 @@ root->right = traversal(nums, maxValueIndex + 1, right);
## 总结
这道题目其实和 [二叉树:构造二叉树登场!](https://mp.weixin.qq.com/s/7r66ap2s-shvVvlZxo59xg) 是一个思路,比[二叉树:构造二叉树登场!](https://mp.weixin.qq.com/s/7r66ap2s-shvVvlZxo59xg) 还简单一些。
这道题目其实和 [二叉树:构造二叉树登场!](https://programmercarl.com/0106.从中序与后序遍历序列构造二叉树.html) 是一个思路,比[二叉树:构造二叉树登场!](https://programmercarl.com/0106.从中序与后序遍历序列构造二叉树.html) 还简单一些。
**注意类似用数组构造二叉树的题目,每次分隔尽量不要定义新的数组,而是通过下表索引直接在原数组上操作,这样可以节约时间和空间上的开销。**

View File

@ -9,7 +9,7 @@
# 657. 机器人能否返回原点
题目地址:https://leetcode-cn.com/problems/robot-return-to-origin/
[力扣题目链接](https://leetcode-cn.com/problems/robot-return-to-origin/)
在二维平面上,有一个机器人从原点 (0, 0) 开始。给出它的移动顺序,判断这个机器人在完成移动后是否在 (0, 0) 处结束。

View File

@ -12,7 +12,7 @@
## 669. 修剪二叉搜索树
题目链接:https://leetcode-cn.com/problems/trim-a-binary-search-tree/
[力扣题目链接](https://leetcode-cn.com/problems/trim-a-binary-search-tree/)
给定一个二叉搜索树同时给定最小边界L 和最大边界 R。通过修剪二叉搜索树使得所有节点的值在[L, R]中 (R>=L) 。你可能需要改变树的根节点,所以结果应当返回修剪好的二叉搜索树的新的根节点。
@ -71,7 +71,7 @@ public:
但是有返回值,更方便,可以通过递归函数的返回值来移除节点。
这样的做法在[二叉树:搜索树中的插入操作](https://mp.weixin.qq.com/s/lwKkLQcfbCNX2W-5SOeZEA)和[二叉树:搜索树中的删除操作](https://mp.weixin.qq.com/s/-p-Txvch1FFk3ygKLjPAKw)中大家已经了解过了。
这样的做法在[二叉树:搜索树中的插入操作](https://programmercarl.com/0701.二叉搜索树中的插入操作.html)和[二叉树:搜索树中的删除操作](https://programmercarl.com/0450.删除二叉搜索树中的节点.html)中大家已经了解过了。
代码如下:

View File

@ -8,7 +8,7 @@
## 674. 最长连续递增序列
题目链接:https://leetcode-cn.com/problems/longest-continuous-increasing-subsequence/
[力扣题目链接](https://leetcode-cn.com/problems/longest-continuous-increasing-subsequence/)
给定一个未经排序的整数数组,找到最长且 连续递增的子序列,并返回该序列的长度。
@ -24,7 +24,7 @@
输入nums = [2,2,2,2,2]
输出1
解释最长连续递增序列是 [2], 长度为1
 
提示
* 0 <= nums.length <= 10^4
@ -33,7 +33,7 @@
## 思路
本题相对于昨天的[动态规划300.最长递增子序列](https://mp.weixin.qq.com/s/f8nLO3JGfgriXep_gJQpqQ)最大的区别在于连续”。
本题相对于昨天的[动态规划300.最长递增子序列](https://programmercarl.com/0300.最长上升子序列.html)最大的区别在于连续”。
本题要求的是最长**连续**递增序列
@ -53,7 +53,7 @@
dp[i + 1] = dp[i] + 1;
**注意这里就体现出和[动态规划300.最长递增子序列](https://mp.weixin.qq.com/s/f8nLO3JGfgriXep_gJQpqQ)的区别!**
**注意这里就体现出和[动态规划300.最长递增子序列](https://programmercarl.com/0300.最长上升子序列.html)的区别!**
因为本题要求连续递增子序列所以就必要比较nums[i + 1]与nums[i]而不用去比较nums[j]与nums[i] j是在0到i之间遍历
@ -144,7 +144,7 @@ public:
本题也是动规里子序列问题的经典题目但也可以用贪心来做大家也会发现贪心好像更简单一点而且空间复杂度仅是O(1)。
在动规分析中,关键是要理解和[动态规划300.最长递增子序列](https://mp.weixin.qq.com/s/f8nLO3JGfgriXep_gJQpqQ)的区别。
在动规分析中,关键是要理解和[动态规划300.最长递增子序列](https://programmercarl.com/0300.最长上升子序列.html)的区别。
**要联动起来,才能理解递增子序列怎么求,递增连续子序列又要怎么求**

View File

@ -11,7 +11,7 @@
# 685.冗余连接II
题目地址:https://leetcode-cn.com/problems/redundant-connection-ii/
[力扣题目链接](https://leetcode-cn.com/problems/redundant-connection-ii/)
在本问题中,有根树指满足以下条件的 有向 图。该树只有一个根节点,所有其他节点都是该根节点的后继。该树除了根节点之外的每一个节点都有且只有一个父节点,而根节点没有父节点。

View File

@ -9,7 +9,7 @@
## 700.二叉搜索树中的搜索
题目地址:https://leetcode-cn.com/problems/search-in-a-binary-search-tree/
[力扣题目地址](https://leetcode-cn.com/problems/search-in-a-binary-search-tree/)
给定二叉搜索树BST的根节点和一个值。 你需要在BST中找到节点值等于给定值的节点。 返回以该节点为根的子树。 如果节点不存在,则返回 NULL。
@ -23,7 +23,7 @@
之前我们讲了都是普通二叉树,那么接下来看看二叉搜索树。
在[关于二叉树,你该了解这些!](https://mp.weixin.qq.com/s/_ymfWYvTNd2GvWvC5HOE4A)中,我们已经讲过了二叉搜索树。
在[关于二叉树,你该了解这些!](https://programmercarl.com/二叉树理论基础.html)中,我们已经讲过了二叉搜索树。
二叉搜索树是一个有序树:
@ -73,7 +73,7 @@ return NULL;
这里可能会疑惑在递归遍历的时候什么时候直接return 递归函数的返回值什么时候不用加这个 return呢
我们在[二叉树:递归函数究竟什么时候需要返回值,什么时候不要返回值?](https://mp.weixin.qq.com/s/6TWAVjxQ34kVqROWgcRFOg)中讲了如果要搜索一条边递归函数就要加返回值这里也是一样的道理
我们在[二叉树:递归函数究竟什么时候需要返回值,什么时候不要返回值?](https://programmercarl.com/0112.路径总和.html)中讲了如果要搜索一条边递归函数就要加返回值这里也是一样的道理
**因为搜索到目标节点了就要立即return了这样才是找到节点就返回搜索某一条边如果不加return就是遍历整棵树了。**
@ -327,7 +327,7 @@ var searchBST = function (root, val) {
return searchBST(root.right, val);
return null;
};
```
```
> 迭代

View File

@ -9,7 +9,7 @@
## 701.二叉搜索树中的插入操作
链接:https://leetcode-cn.com/problems/insert-into-a-binary-search-tree/
[力扣题目链接](https://leetcode-cn.com/problems/insert-into-a-binary-search-tree/)
给定二叉搜索树BST的根节点和要插入树中的值将值插入二叉搜索树。 返回插入后二叉搜索树的根节点。 输入数据保证,新值和原始二叉搜索树中的任意节点值都不同。
@ -164,11 +164,11 @@ public:
## 迭代
再来看看迭代法,对二叉搜索树迭代写法不熟悉,可以看这篇:[二叉树:二叉搜索树登场!](https://mp.weixin.qq.com/s/vsKrWRlETxCVsiRr8v_hHg)
再来看看迭代法,对二叉搜索树迭代写法不熟悉,可以看这篇:[二叉树:二叉搜索树登场!](https://programmercarl.com/0700.二叉搜索树中的搜索.html)
在迭代法遍历的过程中,需要记录一下当前遍历的节点的父节点,这样才能做插入节点的操作。
在[二叉树:搜索树的最小绝对差](https://mp.weixin.qq.com/s/Hwzml6698uP3qQCC1ctUQQ)和[二叉树:我的众数是多少?](https://mp.weixin.qq.com/s/KSAr6OVQIMC-uZ8MEAnGHg)中都是用了记录pre和cur两个指针的技巧本题也是一样的。
在[二叉树:搜索树的最小绝对差](https://programmercarl.com/0530.二叉搜索树的最小绝对差.html)和[二叉树:我的众数是多少?](https://programmercarl.com/0501.二叉搜索树中的众数.html)中都是用了记录pre和cur两个指针的技巧本题也是一样的。
代码如下:

View File

@ -9,7 +9,7 @@
## 704. 二分查找
题目链接:https://leetcode-cn.com/problems/binary-search/
[力扣题目链接](https://leetcode-cn.com/problems/binary-search/)
给定一个 n 个元素有序的升序整型数组 nums 和一个目标值 target  写一个函数搜索 nums 中的 target如果目标值存在返回下标否则返回 -1。
@ -139,7 +139,7 @@ public:
## 相关题目推荐
* [35.搜索插入位置](./0035.搜索插入位置.md)
* [35.搜索插入位置](https://programmercarl.com/0035.搜索插入位置.html)
* 34.在排序数组中查找元素的第一个和最后一个位置
* 69.x 的平方根
* 367.有效的完全平方数

View File

@ -11,7 +11,7 @@
# 707.设计链表
https://leetcode-cn.com/problems/design-linked-list/
[力扣题目链接](https://leetcode-cn.com/problems/design-linked-list/)
题意:
@ -28,9 +28,9 @@ https://leetcode-cn.com/problems/design-linked-list/
# 思路
如果对链表的基础知识还不太懂,可以看这篇文章:[关于链表,你该了解这些!](https://mp.weixin.qq.com/s/fDGMmLrW7ZHlzkzlf_dZkw)
如果对链表的基础知识还不太懂,可以看这篇文章:[关于链表,你该了解这些!](https://programmercarl.com/链表理论基础.html)
如果对链表的虚拟头结点不清楚,可以看这篇文章:[链表:听说用虚拟头节点会方便很多?](https://mp.weixin.qq.com/s/L5aanfALdLEwVWGvyXPDqA)
如果对链表的虚拟头结点不清楚,可以看这篇文章:[链表:听说用虚拟头节点会方便很多?](https://programmercarl.com/0203.移除链表元素.html)
删除链表节点:
![链表-删除节点](https://img-blog.csdnimg.cn/20200806195114541.png)

View File

@ -9,7 +9,7 @@
## 714. 买卖股票的最佳时机含手续费
题目链接:https://leetcode-cn.com/problems/best-time-to-buy-and-sell-stock-with-transaction-fee/
[力扣题目链接](https://leetcode-cn.com/problems/best-time-to-buy-and-sell-stock-with-transaction-fee/)
给定一个整数数组 prices其中第 i 个元素代表了第 i 天的股票价格 非负整数 fee 代表了交易股票的手续费用。
@ -37,11 +37,11 @@
## 思路
本题相对于[贪心算法122.买卖股票的最佳时机II](https://mp.weixin.qq.com/s/VsTFA6U96l18Wntjcg3fcg)多添加了一个条件就是手续费
本题相对于[贪心算法122.买卖股票的最佳时机II](https://programmercarl.com/0122.买卖股票的最佳时机II.html)多添加了一个条件就是手续费
## 贪心算法
[贪心算法122.买卖股票的最佳时机II](https://mp.weixin.qq.com/s/VsTFA6U96l18Wntjcg3fcg)中使用贪心策略不用关心具体什么时候买卖只要收集每天的正利润最后稳稳的就是最大利润了
[贪心算法122.买卖股票的最佳时机II](https://programmercarl.com/0122.买卖股票的最佳时机II.html)中使用贪心策略不用关心具体什么时候买卖只要收集每天的正利润最后稳稳的就是最大利润了
而本题有了手续费就要关系什么时候买卖了因为计算所获得利润需要考虑买卖利润可能不足以手续费的情况
@ -97,7 +97,7 @@ public:
我在公众号代码随想录里将在下一个系列详细讲解动态规划所以本题解先给出我的C++代码带详细注释感兴趣的同学可以自己先学习一下
相对于[贪心算法122.买卖股票的最佳时机II](https://mp.weixin.qq.com/s/VsTFA6U96l18Wntjcg3fcg)的动态规划解法中只需要在计算卖出操作的时候减去手续费就可以了代码几乎是一样的
相对于[贪心算法122.买卖股票的最佳时机II](https://programmercarl.com/0122.买卖股票的最佳时机II.html)的动态规划解法中只需要在计算卖出操作的时候减去手续费就可以了代码几乎是一样的
C++代码如下

View File

@ -8,7 +8,7 @@
## 714.买卖股票的最佳时机含手续费
题目链接:https://leetcode-cn.com/problems/best-time-to-buy-and-sell-stock-with-transaction-fee/
[力扣题目链接](https://leetcode-cn.com/problems/best-time-to-buy-and-sell-stock-with-transaction-fee/)
给定一个整数数组 prices其中第 i 个元素代表了第 i 天的股票价格 非负整数 fee 代表了交易股票的手续费用。
@ -36,7 +36,7 @@
## 思路
在讲解贪心专题的时候我们已经讲过本题了[贪心算法:买卖股票的最佳时机含手续费](https://mp.weixin.qq.com/s/olWrUuDEYw2Jx5rMeG7XAg)
在讲解贪心专题的时候我们已经讲过本题了[贪心算法:买卖股票的最佳时机含手续费](https://programmercarl.com/0714.买卖股票的最佳时机含手续费.html)
使用贪心算法的性能是
* 时间复杂度O(n)
@ -44,7 +44,7 @@
那么我们再来看看是使用动规的方法如何解题
相对于[动态规划122.买卖股票的最佳时机II](https://mp.weixin.qq.com/s/d4TRWFuhaY83HPa6t5ZL-w)本题只需要在计算卖出操作的时候减去手续费就可以了代码几乎是一样的
相对于[动态规划122.买卖股票的最佳时机II](https://programmercarl.com/0122.买卖股票的最佳时机II.html)本题只需要在计算卖出操作的时候减去手续费就可以了代码几乎是一样的
唯一差别在于递推公式部分所以本篇也就不按照动规五部曲详细讲解了主要讲解一下递推公式部分
@ -68,7 +68,7 @@ dp[i][1] 表示第i天不持有股票所得最多现金
所以dp[i][1] = max(dp[i - 1][1], dp[i - 1][0] + prices[i] - fee);
**本题和[动态规划122.买卖股票的最佳时机II](https://mp.weixin.qq.com/s/d4TRWFuhaY83HPa6t5ZL-w)的区别就是这里需要多一个减去手续费的操作**
**本题和[动态规划122.买卖股票的最佳时机II](https://programmercarl.com/0122.买卖股票的最佳时机II.html)的区别就是这里需要多一个减去手续费的操作**
以上分析完毕C++代码如下

View File

@ -8,7 +8,7 @@
## 718. 最长重复子数组
题目链接:https://leetcode-cn.com/problems/maximum-length-of-repeated-subarray/
[力扣题目链接](https://leetcode-cn.com/problems/maximum-length-of-repeated-subarray/)
给两个整数数组 A  B 返回两个数组中公共的、长度最长的子数组的长度。

View File

@ -8,7 +8,7 @@
## 738.单调递增的数字
题目链接: https://leetcode-cn.com/problems/monotone-increasing-digits/
[力扣题目链接](https://leetcode-cn.com/problems/monotone-increasing-digits/)
给定一个非负整数 N找出小于或等于 N 的最大的整数同时这个整数需要满足其各个位数上的数字是单调递增。

View File

@ -9,8 +9,7 @@
# 739. 每日温度
https://leetcode-cn.com/problems/daily-temperatures/
[力扣题目链接](https://leetcode-cn.com/problems/daily-temperatures/)
请根据每日 气温 列表重新生成一个列表。对应位置的输出为要想观测到更高的气温至少需要等待的天数。如果气温在这之后都不会升高请在该位置用 0 来代替。

View File

@ -8,7 +8,7 @@
## 746. 使用最小花费爬楼梯
题目链接:https://leetcode-cn.com/problems/min-cost-climbing-stairs/
[力扣题目链接](https://leetcode-cn.com/problems/min-cost-climbing-stairs/)
数组的每个下标作为一个阶梯,第 i 个阶梯对应着一个非负数的体力花费值 cost[i](下标从 0 开始)。
@ -34,7 +34,7 @@
## 思路
这道题目可以说是昨天[动态规划:爬楼梯](https://mp.weixin.qq.com/s/Ohop0jApSII9xxOMiFhGIw)的花费版本。
这道题目可以说是昨天[动态规划:爬楼梯](https://programmercarl.com/0070.爬楼梯.html)的花费版本。
**注意题目描述:每当你爬上一个阶梯你都要花费对应的体力值,一旦支付了相应的体力值,你就可以选择向上爬一个阶梯或者爬两个阶梯**
@ -185,9 +185,9 @@ public:
# 总结
大家可以发现这道题目相对于 昨天的[动态规划:爬楼梯](https://mp.weixin.qq.com/s/Ohop0jApSII9xxOMiFhGIw)有难了一点,但整体思路是一样。
大家可以发现这道题目相对于 昨天的[动态规划:爬楼梯](https://programmercarl.com/0070.爬楼梯.html)有难了一点,但整体思路是一样。
从[动态规划:斐波那契数](https://mp.weixin.qq.com/s/ko0zLJplF7n_4TysnPOa_w)到 [动态规划:爬楼梯](https://mp.weixin.qq.com/s/Ohop0jApSII9xxOMiFhGIw)再到今天这道题目,录友们感受到循序渐进的梯度了嘛。
从[动态规划:斐波那契数](https://programmercarl.com/0509.斐波那契数.html)到 [动态规划:爬楼梯](https://programmercarl.com/0070.爬楼梯.html)再到今天这道题目,录友们感受到循序渐进的梯度了嘛。
每个系列开始的时候,都有录友和我反馈说题目太简单了,赶紧上难度,但也有录友和我说有点难了,快跟不上了。

View File

@ -9,7 +9,7 @@
## 763.划分字母区间
题目链接: https://leetcode-cn.com/problems/partition-labels/
[力扣题目链接](https://leetcode-cn.com/problems/partition-labels/)
字符串 S 由小写字母组成。我们要把这个字符串划分为尽可能多的片段,同一字母最多出现在一个片段中。返回一个表示每个字符串片段的长度的列表。
@ -20,7 +20,7 @@
划分结果为 "ababcbaca", "defegde", "hijhklij"。
每个字母最多出现在一个片段中。
像 "ababcbacadefegde", "hijhklij" 的划分是错误的,因为划分的片段数较少。
 
提示:
* S的长度在[1, 500]之间。

View File

@ -10,7 +10,7 @@
# 841.钥匙和房间
题目地址:https://leetcode-cn.com/problems/keys-and-rooms/
[力扣题目链接](https://leetcode-cn.com/problems/keys-and-rooms/)
有 N 个房间,开始时你位于 0 号房间。每个房间有不同的号码012...N-1并且房间里可能有一些钥匙能使你进入下一个房间。

View File

@ -9,7 +9,7 @@
# 844.比较含退格的字符串
题目链接:https://leetcode-cn.com/problems/backspace-string-compare/
[力扣题目链接](https://leetcode-cn.com/problems/backspace-string-compare/)
给定 S 和 T 两个字符串,当它们分别被输入到空白的文本编辑器后,判断二者是否相等,并返回结果。 # 代表退格字符。
@ -42,7 +42,7 @@
## 普通方法(使用栈的思路)
这道题目一看就是要使用栈的节奏,这种匹配(消除)问题也是栈的擅长所在,跟着一起刷题的同学应该知道,在[栈与队列:匹配问题都是栈的强项](https://mp.weixin.qq.com/s/1-x6r1wGA9mqIHW5LrMvBg),我就已经提过了一次使用栈来做类似的事情了。
这道题目一看就是要使用栈的节奏,这种匹配(消除)问题也是栈的擅长所在,跟着一起刷题的同学应该知道,在[栈与队列:匹配问题都是栈的强项](https://programmercarl.com/1047.删除字符串中的所有相邻重复项.html),我就已经提过了一次使用栈来做类似的事情了。
**那么本题,确实可以使用栈的思路,但是没有必要使用栈,因为最后比较的时候还要比较栈里的元素,有点麻烦**

View File

@ -9,7 +9,7 @@
## 860.柠檬水找零
题目链接:https://leetcode-cn.com/problems/lemonade-change/
[力扣题目链接](https://leetcode-cn.com/problems/lemonade-change/)
在柠檬水摊上每一杯柠檬水的售价为 5 美元。

View File

@ -8,7 +8,7 @@
<p align="center"><strong>欢迎大家<a href="https://mp.weixin.qq.com/s/tqCxrMEU-ajQumL1i8im9A">参与本项目</a>,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!</strong></p>
# 925.长按键入
题目链接:https://leetcode-cn.com/problems/long-pressed-name/
[力扣题目链接](https://leetcode-cn.com/problems/long-pressed-name/)
你的朋友正在使用键盘输入他的名字 name。偶尔在键入字符 c 按键可能会被长按而字符可能被输入 1 次或多次。

View File

@ -9,7 +9,7 @@
# 941.有效的山脉数组
题目链接:https://leetcode-cn.com/problems/valid-mountain-array/
[力扣题目链接](https://leetcode-cn.com/problems/valid-mountain-array/)
给定一个整数数组 arr如果它是有效的山脉数组就返回 true否则返回 false。
@ -71,7 +71,7 @@ public:
};
```
如果想系统学一学双指针的话, 可以看一下这篇[双指针法:总结篇!](https://mp.weixin.qq.com/s/_p7grwjISfMh0U65uOyCjA)
如果想系统学一学双指针的话, 可以看一下这篇[双指针法:总结篇!](https://programmercarl.com/双指针总结.html)
# 其他语言版本

View File

@ -9,7 +9,7 @@
## 968.监控二叉树
题目地址 : https://leetcode-cn.com/problems/binary-tree-cameras/
[力扣题目链接](https://leetcode-cn.com/problems/binary-tree-cameras/)
给定一个二叉树,我们在树的节点上安装摄像头。

View File

@ -10,7 +10,7 @@
# 977.有序数组的平方
https://leetcode-cn.com/problems/squares-of-a-sorted-array/
[力扣题目链接](https://leetcode-cn.com/problems/squares-of-a-sorted-array/)
给你一个按 非递减顺序 排序的整数数组 nums返回 每个数字的平方 组成的新数组,要求也按 非递减顺序 排序。

View File

@ -10,7 +10,7 @@
# 1002. 查找常用字符
https://leetcode-cn.com/problems/find-common-characters/
[力扣题目链接](https://leetcode-cn.com/problems/find-common-characters/)
给定仅有小写字母组成的字符串数组 A返回列表中的每个字符串中都显示的全部字符包括重复字符组成的列表。例如如果一个字符在每个字符串中出现 3 次,但不是 4 次,则需要在最终答案中包含该字符 3 次。
@ -23,7 +23,7 @@ https://leetcode-cn.com/problems/find-common-characters/
【示例二】
输入:["cool","lock","cook"]
输出:["c","o"]
 
# 思路
@ -40,9 +40,9 @@ https://leetcode-cn.com/problems/find-common-characters/
可以看出这是指数级别的时间复杂度,非常高,而且代码实现也不容易,因为要统计 重复的字符,还要适当的替换或者去重。
那我们还是哈希法吧。如果对哈希法不了解,可以看这篇:[关于哈希表,你该了解这些!](https://mp.weixin.qq.com/s/RSUANESA_tkhKhYe3ZR8Jg)。
那我们还是哈希法吧。如果对哈希法不了解,可以看这篇:[关于哈希表,你该了解这些!](https://programmercarl.com/哈希表理论基础.html)。
如果对用数组来做哈希法不了解的话,可以看这篇:[把数组当做哈希表来用,很巧妙!](https://mp.weixin.qq.com/s/ffS8jaVFNUWyfn_8T31IdA)。
如果对用数组来做哈希法不了解的话,可以看这篇:[把数组当做哈希表来用,很巧妙!](https://programmercarl.com/0242.有效的字母异位词.html)。
了解了哈希法,理解了数组在哈希法中的应用之后,可以来看解题思路了。
@ -233,41 +233,7 @@ var commonChars = function (words) {
return res
};
```
GO
```golang
func commonChars(words []string) []string {
length:=len(words)
fre:=make([][]int,0)//统计每个字符串的词频
res:=make([]string,0)
//统计词频
for i:=0;i<length;i++{
var row [26]int//存放该字符串的词频
for j:=0;j<len(words[i]);j++{
row[words[i][j]-97]++
}
fre=append(fre,row[:])
}
//查找一列的最小值
for j:=0;j<len(fre[0]);j++{
pre:=fre[0][j]
for i:=0;i<len(fre);i++{
pre=min(pre,fre[i][j])
}
//将该字符添加到结果集(按照次数)
tmpString:=string(j+97)
for i:=0;i<pre;i++{
res=append(res,tmpString)
}
}
return res
}
func min(a,b int)int{
if a>b{
return b
}
return a
}
```
-----------------------
* 作者微信:[程序员Carl](https://mp.weixin.qq.com/s/b66DFkOp8OOxdZC_xLZxfw)
* B站视频[代码随想录](https://space.bilibili.com/525438321)

View File

@ -9,7 +9,7 @@
## 1005.K次取反后最大化的数组和
题目地址:https://leetcode-cn.com/problems/maximize-sum-of-array-after-k-negations/
[力扣题目链接](https://leetcode-cn.com/problems/maximize-sum-of-array-after-k-negations/)
给定一个整数数组 A我们只能用以下方法修改该数组我们选择某个索引 i 并将 A[i] 替换为 -A[i],然后总共重复这个过程 K 次。(我们可以多次选择同一个索引 i。

View File

@ -8,7 +8,7 @@
## 1035.不相交的线
题目链接: https://leetcode-cn.com/problems/uncrossed-lines/
[力扣题目链接](https://leetcode-cn.com/problems/uncrossed-lines/)
我们在两条独立的水平线上按给定的顺序写下 A  B 中的整数。
@ -35,13 +35,13 @@
这么分析完之后,大家可以发现:**本题说是求绘制的最大连线数,其实就是求两个字符串的最长公共子序列的长度!**
那么本题就和我们刚刚讲过的这道题目[动态规划1143.最长公共子序列](https://mp.weixin.qq.com/s/Qq0q4HaE4TyasCTj2WGFOg)就是一样一样的了。
那么本题就和我们刚刚讲过的这道题目[动态规划1143.最长公共子序列](https://programmercarl.com/1143.最长公共子序列.html)就是一样一样的了。
一样到什么程度呢? 把字符串名字改一下其他代码都不用改直接copy过来就行了。
其实本题就是求最长公共子序列的长度,介于我们刚刚讲过[动态规划1143.最长公共子序列](https://mp.weixin.qq.com/s/Qq0q4HaE4TyasCTj2WGFOg),所以本题我就不再做动规五部曲分析了。
其实本题就是求最长公共子序列的长度,介于我们刚刚讲过[动态规划1143.最长公共子序列](https://programmercarl.com/1143.最长公共子序列.html),所以本题我就不再做动规五部曲分析了。
如果大家有点遗忘了最长公共子序列,就再看一下这篇:[动态规划1143.最长公共子序列](https://mp.weixin.qq.com/s/Qq0q4HaE4TyasCTj2WGFOg)
如果大家有点遗忘了最长公共子序列,就再看一下这篇:[动态规划1143.最长公共子序列](https://programmercarl.com/1143.最长公共子序列.html)
本题代码如下:
@ -66,9 +66,9 @@ public:
## 总结
看到代码大家也可以发现其实就是求两个字符串的最长公共子序列,但如果没有做过[1143.最长公共子序列](https://mp.weixin.qq.com/s/Qq0q4HaE4TyasCTj2WGFOg),本题其实还有很有难度的。
看到代码大家也可以发现其实就是求两个字符串的最长公共子序列,但如果没有做过[1143.最长公共子序列](https://programmercarl.com/1143.最长公共子序列.html),本题其实还有很有难度的。
这是Carl为什么要先讲[1143.最长公共子序列](https://mp.weixin.qq.com/s/Qq0q4HaE4TyasCTj2WGFOg)再讲本题,大家会发现一个正确的刷题顺序对算法学习是非常重要的!
这是Carl为什么要先讲[1143.最长公共子序列](https://programmercarl.com/1143.最长公共子序列.html)再讲本题,大家会发现一个正确的刷题顺序对算法学习是非常重要的!
这也是Carl做了很多题目包括ACM和力扣才总结出来的规律大家仔细体会一下哈。

View File

@ -13,7 +13,7 @@
# 1047. 删除字符串中的所有相邻重复项
https://leetcode-cn.com/problems/remove-all-adjacent-duplicates-in-string/
[力扣题目链接](https://leetcode-cn.com/problems/remove-all-adjacent-duplicates-in-string/)
给出由小写字母组成的字符串 S重复项删除操作会选择两个相邻且相同的字母并删除它们。
@ -26,7 +26,7 @@ https://leetcode-cn.com/problems/remove-all-adjacent-duplicates-in-string/
* 输入:"abbaca"
* 输出:"ca"
* 解释:例如,在 "abbaca" 中,我们可以删除 "bb" 由于两字母相邻且相同,这是此时唯一可以执行删除操作的重复项。之后我们得到字符串 "aaca",其中又只有 "aa" 可以执行重复项删除操作,所以最后的字符串为 "ca"。
 
提示:
* 1 <= S.length <= 20000
@ -197,38 +197,15 @@ class Solution {
Python
```python3
# 方法一,使用栈,推荐!
class Solution:
def removeDuplicates(self, s: str) -> str:
res = list()
for item in s:
if res and res[-1] == item:
res.pop()
t = list()
for i in s:
if t and t[-1] == i:
t.pop(-1)
else:
res.append(item)
return "".join(res) # 字符串拼接
```
```python3
# 方法二,使用双指针模拟栈,如果不让用栈可以作为备选方法。
class Solution:
def removeDuplicates(self, s: str) -> str:
res = list(s)
slow = fast = 0
length = len(res)
while fast < length:
# 如果一样直接换不一样会把后面的填在slow的位置
res[slow] = res[fast]
# 如果发现和前一个一样,就退一格指针
if slow > 0 and res[slow] == res[slow - 1]:
slow -= 1
else:
slow += 1
fast += 1
return ''.join(res[0: slow])
t.append(i)
return "".join(t) # 字符串拼接
```
Go

View File

@ -9,7 +9,7 @@
## 1049. 最后一块石头的重量 II
题目链接:https://leetcode-cn.com/problems/last-stone-weight-ii/
[力扣题目链接](https://leetcode-cn.com/problems/last-stone-weight-ii/)
题目难度:中等
@ -29,7 +29,7 @@
组合 7 和 8得到 1所以数组转化为 [2,1,1,1]
组合 2 和 1得到 1所以数组转化为 [1,1,1]
组合 1 和 1得到 0所以数组转化为 [1],这就是最优值。
 
提示:
* 1 <= stones.length <= 30
@ -39,12 +39,12 @@
如果对背包问题不都熟悉先看这两篇:
* [动态规划关于01背包问题你该了解这些](https://mp.weixin.qq.com/s/FwIiPPmR18_AJO5eiidT6w)
* [动态规划关于01背包问题你该了解这些滚动数组](https://mp.weixin.qq.com/s/M4uHxNVKRKm5HPjkNZBnFA)
* [动态规划关于01背包问题你该了解这些](https://programmercarl.com/背包理论基础01背包-1.html)
* [动态规划关于01背包问题你该了解这些滚动数组](https://programmercarl.com/背包理论基础01背包-2.html)
本题其实就是尽量让石头分成重量相同的两堆,相撞之后剩下的石头最小,**这样就化解成01背包问题了**。
是不是感觉和昨天讲解的[416. 分割等和子集](https://mp.weixin.qq.com/s/sYw3QtPPQ5HMZCJcT4EaLQ)非常像了。
是不是感觉和昨天讲解的[416. 分割等和子集](https://programmercarl.com/0416.分割等和子集.html)非常像了。
本题物品的重量为store[i]物品的价值也为store[i]。
@ -89,7 +89,7 @@ vector<int> dp(15001, 0);
4. 确定遍历顺序
在[动态规划关于01背包问题你该了解这些滚动数组](https://mp.weixin.qq.com/s/M4uHxNVKRKm5HPjkNZBnFA)中就已经说明如果使用一维dp数组物品遍历的for循环放在外层遍历背包的for循环放在内层且内层for循环倒叙遍历
在[动态规划关于01背包问题你该了解这些滚动数组](https://programmercarl.com/背包理论基础01背包-2.html)中就已经说明如果使用一维dp数组物品遍历的for循环放在外层遍历背包的for循环放在内层且内层for循环倒叙遍历
代码如下:
@ -143,9 +143,9 @@ public:
## 总结
本题其实和[416. 分割等和子集](https://mp.weixin.qq.com/s/sYw3QtPPQ5HMZCJcT4EaLQ)几乎是一样的只是最后对dp[target]的处理方式不同。
本题其实和[416. 分割等和子集](https://programmercarl.com/0416.分割等和子集.html)几乎是一样的只是最后对dp[target]的处理方式不同。
[416. 分割等和子集](https://mp.weixin.qq.com/s/sYw3QtPPQ5HMZCJcT4EaLQ)相当于是求背包是否正好装满,而本题是求背包最多能装多少。
[416. 分割等和子集](https://programmercarl.com/0416.分割等和子集.html)相当于是求背包是否正好装满,而本题是求背包最多能装多少。

View File

@ -8,7 +8,7 @@
## 1143.最长公共子序列
题目链接: https://leetcode-cn.com/problems/longest-common-subsequence/
[力扣题目链接](https://leetcode-cn.com/problems/longest-common-subsequence/)
给定两个字符串 text1 和 text2返回这两个字符串的最长公共子序列的长度。
@ -41,7 +41,7 @@
## 思路
本题和[动态规划718. 最长重复子数组](https://mp.weixin.qq.com/s/U5WaWqBwdoxzQDotOdWqZg)区别在于这里不要求是连续的了,但要有相对顺序,即:"ace" 是 "abcde" 的子序列,但 "aec" 不是 "abcde" 的子序列。
本题和[动态规划718. 最长重复子数组](https://programmercarl.com/0718.最长重复子数组.html)区别在于这里不要求是连续的了,但要有相对顺序,即:"ace" 是 "abcde" 的子序列,但 "aec" 不是 "abcde" 的子序列。
继续动规五部曲分析如下:

View File

@ -8,7 +8,7 @@
# 1207.独一无二的出现次数
链接:https://leetcode-cn.com/problems/unique-number-of-occurrences/
[力扣题目链接](https://leetcode-cn.com/problems/unique-number-of-occurrences/)
给你一个整数数组 arr请你帮忙统计数组中每个数的出现次数。
@ -35,9 +35,9 @@
# 思路
这道题目数组在是哈希法中的经典应用,如果对数组在哈希法中的使用还不熟悉的同学可以看这两篇:[数组在哈希法中的应用](https://mp.weixin.qq.com/s/ffS8jaVFNUWyfn_8T31IdA)和[哈希法383. 赎金信](https://mp.weixin.qq.com/s/qAXqv--UERmiJNNpuphOUQ)
这道题目数组在是哈希法中的经典应用,如果对数组在哈希法中的使用还不熟悉的同学可以看这两篇:[数组在哈希法中的应用](https://programmercarl.com/0242.有效的字母异位词.html)和[哈希法383. 赎金信](https://programmercarl.com/0383.赎金信.html)
进而可以学习一下[set在哈希法中的应用](https://mp.weixin.qq.com/s/aMSA5zrp3jJcLjuSB0Es2Q),以及[map在哈希法中的应用](https://mp.weixin.qq.com/s/vaMsLnH-f7_9nEK4Cuu3KQ)
进而可以学习一下[set在哈希法中的应用](https://programmercarl.com/0349.两个数组的交集.html),以及[map在哈希法中的应用](https://programmercarl.com/0001.两数之和.html)
回归本题,**本题强调了-1000 <= arr[i] <= 1000**那么就可以用数组来做哈希arr[i]作为哈希表数组的下标那么arr[i]可以是负数,怎么办?负数不能做数组下标。

View File

@ -9,7 +9,7 @@
# 1365.有多少小于当前数字的数字
题目链接:https://leetcode-cn.com/problems/sort-integers-by-the-number-of-1-bits/
[力扣题目链接](https://leetcode-cn.com/problems/sort-integers-by-the-number-of-1-bits/)
给你一个数组 nums对于其中每个元素 nums[i],请你统计数组中比它小的所有数字的数目。

View File

@ -10,14 +10,14 @@
# 1365.有多少小于当前数字的数字
题目链接:https://leetcode-cn.com/problems/how-many-numbers-are-smaller-than-the-current-number/
[力扣题目链接](https://leetcode-cn.com/problems/how-many-numbers-are-smaller-than-the-current-number/)
给你一个数组 nums对于其中每个元素 nums[i],请你统计数组中比它小的所有数字的数目。
换而言之对于每个 nums[i] 你必须计算出有效的 j 的数量其中 j 满足 j != i 且 nums[j] < nums[i] 
以数组形式返回答案
 
示例 1
* 输入nums = [8,1,2,2,3]
@ -36,7 +36,7 @@
示例 3
* 输入nums = [7,7,7,7]
* 输出[0,0,0,0]
 
提示
* 2 <= nums.length <= 500
* 0 <= nums[i] <= 100

View File

@ -9,7 +9,7 @@
# 1382.将二叉搜索树变平衡
题目地址:https://leetcode-cn.com/problems/balance-a-binary-search-tree/
[力扣题目链接](https://leetcode-cn.com/problems/balance-a-binary-search-tree/)
给你一棵二叉搜索树,请你返回一棵 平衡后 的二叉搜索树,新生成的树应该与原来的树有着相同的节点值。
@ -35,8 +35,8 @@
这道题目,可以中序遍历把二叉树转变为有序数组,然后在根据有序数组构造平衡二叉搜索树。
建议做这道题之前,先看如下两篇题解:
* [98.验证二叉搜索树](https://mp.weixin.qq.com/s/8odY9iUX5eSi0eRFSXFD4Q) 学习二叉搜索树的特性
* [108.将有序数组转换为二叉搜索树](https://mp.weixin.qq.com/s/sy3ygnouaZVJs8lhFgl9mw) 学习如何通过有序数组构造二叉搜索树
* [98.验证二叉搜索树](https://programmercarl.com/0098.验证二叉搜索树.html) 学习二叉搜索树的特性
* [108.将有序数组转换为二叉搜索树](https://programmercarl.com/0108.将有序数组转换为二叉搜索树.html) 学习如何通过有序数组构造二叉搜索树
这两道题目做过之后,本题分分钟就可以做出来了。