Merge branch 'youngyangyang04:master' into master

This commit is contained in:
Jack_ZhijieFang
2022-08-18 15:12:22 +08:00
committed by GitHub
57 changed files with 696 additions and 244 deletions

144
README.md
View File

@ -4,11 +4,12 @@
> 1. **介绍**:本项目是一套完整的刷题计划,旨在帮助大家少走弯路,循序渐进学算法,[关注作者](#关于作者)
> 2. **PDF版本** [「代码随想录」算法精讲 PDF 版本](https://programmercarl.com/other/algo_pdf.html) 。
> 3. **最强八股文:**[代码随想录知识星球精华PDF](https://www.programmercarl.com/other/kstar_baguwen.html)
> 4. **刷题顺序** README已经将刷题顺序排好了按照顺序一道一道刷就可以。
> 5. **学习社区** : 一起学习打卡/面试技巧/如何选择offer/大厂内推/职场规则/简历修改/技术分享/程序人生。欢迎加入[「代码随想录」知识星球](https://programmercarl.com/other/kstar.html)
> 6. **提交代码**本项目统一使用C++语言进行讲解但已经有Java、Python、Go、JavaScript等等多语言版本感谢[这里的每一位贡献者](https://github.com/youngyangyang04/leetcode-master/graphs/contributors),如果你也想贡献代码点亮你的头像,[点击这里](https://mp.weixin.qq.com/s/tqCxrMEU-ajQumL1i8im9A)了解提交代码的方式
> 7. **转载须知** :以下所有文章皆为我([程序员Carl](https://github.com/youngyangyang04))的原创。引用本项目文章请注明出处,发现恶意抄袭或搬运,会动用法律武器维护自己的权益。让我们一起维护一个良好的技术创作环境!
> 3. **算法公开课** : [《代码随想录》算法视频公开课](https://www.bilibili.com/video/BV1fA4y1o715) 。
> 4. **最强八股文:**[代码随想录知识星球精华PDF](https://www.programmercarl.com/other/kstar_baguwen.html)
> 5. **刷题顺序** README已经将刷题顺序排好了按照顺序一道一道刷就可以
> 6. **学习社区** : 一起学习打卡/面试技巧/如何选择offer/大厂内推/职场规则/简历修改/技术分享/程序人生。欢迎加入[「代码随想录」知识星球](https://programmercarl.com/other/kstar.html)
> 7. **提交代码**本项目统一使用C++语言进行讲解但已经有Java、Python、Go、JavaScript等等多语言版本感谢[这里的每一位贡献者](https://github.com/youngyangyang04/leetcode-master/graphs/contributors),如果你也想贡献代码点亮你的头像,[点击这里](https://mp.weixin.qq.com/s/tqCxrMEU-ajQumL1i8im9A)了解提交代码的方式。
> 8. **转载须知** :以下所有文章皆为我([程序员Carl](https://github.com/youngyangyang04))的原创。引用本项目文章请注明出处,发现恶意抄袭或搬运,会动用法律武器维护自己的权益。让我们一起维护一个良好的技术创作环境!
<p align="center">
<a href="programmercarl.com" target="_blank">
@ -141,77 +142,77 @@
## 数组
1. [数组过于简单,但你该了解这些!](./problems/数组理论基础.md)
2. [数组:每次遇到二分法,都是一看就会,一写就废](./problems/0704.二分查找.md)
3. [数组:移除元素很难么?](./problems/0027.移除元素.md)
4. [数组:序数组的平方,还有序么?](./problems/0977.有序数组的平方.md)
5. [数组:滑动窗口拯救了你](./problems/0209.长度最小的子数组.md)
6. [数组:这个循环可以转懵很多人!](./problems/0059.螺旋矩阵II.md)
2. [数组:二分查找](./problems/0704.二分查找.md)
3. [数组:移除元素](./problems/0027.移除元素.md)
4. [数组:序数组的平方](./problems/0977.有序数组的平方.md)
5. [数组:长度最小的子数组](./problems/0209.长度最小的子数组.md)
6. [数组:螺旋矩阵II](./problems/0059.螺旋矩阵II.md)
7. [数组:总结篇](./problems/数组总结篇.md)
## 链表
1. [关于链表,你该了解这些!](./problems/链表理论基础.md)
2. [链表:听说用虚拟头节点会方便很多?](./problems/0203.移除链表元素.md)
3. [链表:一道题目考察了常见的五个操作!](./problems/0707.设计链表.md)
4. [链表:听说过两天反转链表又写不出来了?](./problems/0206.翻转链表.md)
2. [链表:移除链表元素](./problems/0203.移除链表元素.md)
3. [链表:设计链表](./problems/0707.设计链表.md)
4. [链表:翻转链表](./problems/0206.翻转链表.md)
5. [链表:两两交换链表中的节点](./problems/0024.两两交换链表中的节点.md)
6. [链表:删除链表的倒数第 N 个结点](./problems/0019.删除链表的倒数第N个节点.md)
7. [链表:链表相交](./problems/面试题02.07.链表相交.md)
8. [链表:环找到了,那入口呢?](./problems/0142.环形链表II.md)
8. [链表:环形链表](./problems/0142.环形链表II.md)
9. [链表:总结篇!](./problems/链表总结篇.md)
## 哈希表
1. [关于哈希表,你该了解这些!](./problems/哈希表理论基础.md)
2. [哈希表:可以拿数组当哈希表来用,但哈希值不要太大](./problems/0242.有效的字母异位词.md)
2. [哈希表:有效的字母异位词](./problems/0242.有效的字母异位词.md)
3. [哈希表:查找常用字符](./problems/1002.查找常用字符.md)
4. [哈希表:哈希值太大了还是得用set](./problems/0349.两个数组的交集.md)
5. [哈希表:用set来判断快乐数](./problems/0202.快乐数.md)
6. [哈希表:map等候多时了](./problems/0001.两数之和.md)
7. [哈希表:其实需要哈希的地方都能找到map的身影](./problems/0454.四数相加II.md)
8. [哈希表:这道题目我做过?](./problems/0383.赎金信.md)
9. [哈希表:解决了两数之和,那么能解决三数之和么?](./problems/0015.三数之和.md)
10. [双指针法:一样的道理,能解决四数之和](./problems/0018.四数之和.md)
11. [哈希表:总结篇!(每逢总结必经典)](./problems/哈希表总结.md)
4. [哈希表:两个数组的交集](./problems/0349.两个数组的交集.md)
5. [哈希表:快乐数](./problems/0202.快乐数.md)
6. [哈希表:两数之和](./problems/0001.两数之和.md)
7. [哈希表:四数相加II](./problems/0454.四数相加II.md)
8. [哈希表:赎金信](./problems/0383.赎金信.md)
9. [哈希表:三数之和](./problems/0015.三数之和.md)
10. [双指针法:四数之和](./problems/0018.四数之和.md)
11. [哈希表:总结篇!](./problems/哈希表总结.md)
## 字符串
1. [字符串:这道题目,使用库函数一行代码搞定](./problems/0344.反转字符串.md)
2. [字符串:简单的反转还不够!](./problems/0541.反转字符串II.md)
1. [字符串:反转字符串](./problems/0344.反转字符串.md)
2. [字符串:反转字符串II](./problems/0541.反转字符串II.md)
3. [字符串:替换空格](./problems/剑指Offer05.替换空格.md)
4. [字符串:花式反转还不够!](./problems/0151.翻转字符串里的单词.md)
5. [字符串:反转个字符串还有这个用处?](./problems/剑指Offer58-II.左旋转字符串.md)
4. [字符串:翻转字符串里的单词](./problems/0151.翻转字符串里的单词.md)
5. [字符串:左旋转字符串](./problems/剑指Offer58-II.左旋转字符串.md)
6. [帮你把KMP算法学个通透](./problems/0028.实现strStr.md)
8. [字符串:KMP算法还能干这个](./problems/0459.重复的子字符串.md)
8. [字符串:重复的子字符串](./problems/0459.重复的子字符串.md)
9. [字符串:总结篇!](./problems/字符串总结.md)
## 双指针法
双指针法基本都是应用在数组,字符串与链表的题目上
1. [数组:移除元素很难么?](./problems/0027.移除元素.md)
2. [字符串:这道题目,使用库函数一行代码搞定](./problems/0344.反转字符串.md)
1. [数组:移除元素](./problems/0027.移除元素.md)
2. [字符串:反转字符串](./problems/0344.反转字符串.md)
3. [字符串:替换空格](./problems/剑指Offer05.替换空格.md)
4. [字符串:花式反转还不够!](./problems/0151.翻转字符串里的单词.md)
5. [链表:听说过两天反转链表又写不出来了?](./problems/0206.翻转链表.md)
4. [字符串:翻转字符串里的单词](./problems/0151.翻转字符串里的单词.md)
5. [链表:翻转链表](./problems/0206.翻转链表.md)
6. [链表:删除链表的倒数第 N 个结点](./problems/0019.删除链表的倒数第N个节点.md)
7. [链表:链表相交](./problems/面试题02.07.链表相交.md)
8. [链表:环找到了,那入口呢?](./problems/0142.环形链表II.md)
9. [哈希表:解决了两数之和,那么能解决三数之和么?](./problems/0015.三数之和.md)
10. [双指针法:一样的道理,能解决四数之和](./problems/0018.四数之和.md)
11. [双指针:总结篇!](./problems/双指针总结.md)
8. [链表:环形链表](./problems/0142.环形链表II.md)
9. [双指针:三数之和](./problems/0015.三数之和.md)
10. [双指针四数之和](./problems/0018.四数之和.md)
11. [双指针:总结篇!](./problems/双指针总结.md)
## 栈与队列
1. [栈与队列:来看看栈和队列不为人知的一面](./problems/栈与队列理论基础.md)
2. [栈与队列:用栈实现队列怎么样?](./problems/0232.用栈实现队列.md)
3. [栈与队列:用队列实现栈还有点别扭](./problems/0225.用队列实现栈.md)
4. [栈与队列:系统中处处都是栈的应用](./problems/0020.有效的括号.md)
5. [栈与队列:匹配问题都是栈的强](./problems/1047.删除字符串中的所有相邻重复项.md)
6. [栈与队列:有没有想过计算机是如何处理表达式的?](./problems/0150.逆波兰表达式求值.md)
7. [栈与队列:滑动窗口里求最大值引出一个重要数据结构](./problems/0239.滑动窗口最大值.md)
8. [栈与队列:求前 K 个高频元素和队列有啥关系?](./problems/0347.前K个高频元素.md)
2. [栈与队列:用栈实现队列](./problems/0232.用栈实现队列.md)
3. [栈与队列:用队列实现栈](./problems/0225.用队列实现栈.md)
4. [栈与队列:有效的括号](./problems/0020.有效的括号.md)
5. [栈与队列:删除字符串中的所有相邻重复](./problems/1047.删除字符串中的所有相邻重复项.md)
6. [栈与队列:逆波兰表达式求值](./problems/0150.逆波兰表达式求值.md)
7. [栈与队列:滑动窗口最大值](./problems/0239.滑动窗口最大值.md)
8. [栈与队列:前K个高频元素](./problems/0347.前K个高频元素.md)
9. [栈与队列:总结篇!](./problems/栈与队列总结.md)
## 二叉树
@ -220,34 +221,34 @@
<img src='https://img-blog.csdnimg.cn/20210219190809451.png' width=600 alt='二叉树大纲'> </img></div>
1. [关于二叉树,你该了解这些!](./problems/二叉树理论基础.md)
2. [二叉树:一入递归深似海从此offer是路人](./problems/二叉树的递归遍历.md)
3. [二叉树:听说递归能做的,栈也能做!](./problems/二叉树的迭代遍历.md)
4. [二叉树:前中后序迭代方式的写法就不能统一一下么?](./problems/二叉树的统一迭代法.md)
5. [二叉树:层序遍历登场!](./problems/0102.二叉树的层序遍历.md)
6. [二叉树:你真的会翻转二叉树么?](./problems/0226.翻转二叉树.md)
2. [二叉树:二叉树的递归遍历](./problems/二叉树的递归遍历.md)
3. [二叉树:二叉树的迭代遍历](./problems/二叉树的迭代遍历.md)
4. [二叉树:二叉树的统一迭代法](./problems/二叉树的统一迭代法.md)
5. [二叉树:二叉树的层序遍历](./problems/0102.二叉树的层序遍历.md)
6. [二叉树:翻转二叉树](./problems/0226.翻转二叉树.md)
7. [本周小结!(二叉树)](./problems/周总结/20200927二叉树周末总结.md)
8. [二叉树:对称么?](./problems/0101.对称二叉树.md)
9. [二叉树:看看这些树的最大深度](./problems/0104.二叉树的最大深度.md)
10. [二叉树:看看这些树的最小深度](./problems/0111.二叉树的最小深度.md)
11. [二叉树:我有多少个节点?](./problems/0222.完全二叉树的节点个数.md)
12. [二叉树:平衡么?](./problems/0110.平衡二叉树.md)
13. [二叉树:找我的所有路径](./problems/0257.二叉树的所有路径.md)
8. [二叉树:对称二叉树](./problems/0101.对称二叉树.md)
9. [二叉树:二叉树的最大深度](./problems/0104.二叉树的最大深度.md)
10. [二叉树:二叉树的最小深度](./problems/0111.二叉树的最小深度.md)
11. [二叉树:完全二叉树的节点个数](./problems/0222.完全二叉树的节点个数.md)
12. [二叉树:平衡二叉树](./problems/0110.平衡二叉树.md)
13. [二叉树:二叉树的所有路径](./problems/0257.二叉树的所有路径.md)
14. [本周总结!二叉树系列二](./problems/周总结/20201003二叉树周末总结.md)
15. [二叉树:以为使用了递归,其实还隐藏着回溯](./problems/二叉树中递归带着回溯.md)
16. [二叉树:做了这么多题目了,我的左叶子之和是多少?](./problems/0404.左叶子之和.md)
17. [二叉树:我的左下角的值是多少?](./problems/0513.找树左下角的值.md)
15. [二叉树:二叉树中递归带着回溯](./problems/二叉树中递归带着回溯.md)
16. [二叉树:左叶子之和](./problems/0404.左叶子之和.md)
17. [二叉树:找树左下角的值](./problems/0513.找树左下角的值.md)
18. [二叉树:路径总和](./problems/0112.路径总和.md)
19. [二叉树:构造二叉树登场!](./problems/0106.从中序与后序遍历序列构造二叉树.md)
20. [二叉树:构造一棵最大二叉树](./problems/0654.最大二叉树.md)
19. [二叉树:构造二叉树](./problems/0106.从中序与后序遍历序列构造二叉树.md)
20. [二叉树:最大二叉树](./problems/0654.最大二叉树.md)
21. [本周小结!(二叉树系列三)](./problems/周总结/20201010二叉树周末总结.md)
22. [二叉树:合并两个二叉树](./problems/0617.合并二叉树.md)
23. [二叉树:二叉搜索树登场!](./problems/0700.二叉搜索树中的搜索.md)
24. [二叉树:我是不是一棵二叉搜索树](./problems/0098.验证二叉搜索树.md)
24. [二叉树:验证二叉搜索树](./problems/0098.验证二叉搜索树.md)
25. [二叉树:搜索树的最小绝对差](./problems/0530.二叉搜索树的最小绝对差.md)
26. [二叉树:我的众数是多少?](./problems/0501.二叉搜索树中的众数.md)
26. [二叉树:二叉搜索树中的众数](./problems/0501.二叉搜索树中的众数.md)
27. [二叉树:公共祖先问题](./problems/0236.二叉树的最近公共祖先.md)
28. [本周小结!(二叉树系列四)](./problems/周总结/20201017二叉树周末总结.md)
29. [二叉树:搜索树的公共祖先问题](./problems/0235.二叉搜索树的最近公共祖先.md)
29. [二叉树:搜索树的最近公共祖先](./problems/0235.二叉搜索树的最近公共祖先.md)
30. [二叉树:搜索树中的插入操作](./problems/0701.二叉搜索树中的插入操作.md)
31. [二叉树:搜索树中的删除操作](./problems/0450.删除二叉搜索树中的节点.md)
32. [二叉树:修剪一棵搜索树](./problems/0669.修剪二叉搜索树.md)
@ -500,25 +501,6 @@
[各类基础算法模板](https://github.com/youngyangyang04/leetcode/blob/master/problems/算法模板.md)
# B站算法视频讲解
以下为[B站「代码随想录」](https://space.bilibili.com/525438321)算法讲解视频:
* [KMP算法理论篇](https://www.bilibili.com/video/BV1PD4y1o7nd)
* [KMP算法代码篇](https://www.bilibili.com/video/BV1M5411j7Xx)
* [回溯算法理论基础](https://www.bilibili.com/video/BV1cy4y167mM)
* [回溯算法之组合问题力扣题目77.组合)](https://www.bilibili.com/video/BV1ti4y1L7cv)
* [组合问题的剪枝操作对应力扣题目77.组合)](https://www.bilibili.com/video/BV1wi4y157er)
* [组合总和对应力扣题目39.组合总和)](https://www.bilibili.com/video/BV1KT4y1M7HJ/)
* [分割回文串对应力扣题目131.分割回文串)](https://www.bilibili.com/video/BV1c54y1e7k6)
* [二叉树理论基础](https://www.bilibili.com/video/BV1Hy4y1t7ij)
* [二叉树的递归遍历](https://www.bilibili.com/video/BV1Wh411S7xt)
* [二叉树的非递归遍历(一)](https://www.bilibili.com/video/BV15f4y1W7i2)
(持续更新中....
# 贡献者
[点此这里](https://github.com/youngyangyang04/leetcode-master/graphs/contributors)查看LeetCode-Master的所有贡献者。感谢他们补充了LeetCode-Master的其他语言版本让更多的读者收益于此项目。

View File

@ -263,13 +263,15 @@ php
```php
function twoSum(array $nums, int $target): array
{
for ($i = 0; $i < count($nums);$i++) {
// 计算剩下的数
$residue = $target - $nums[$i];
// 匹配的index有则返回index 无则返回false
$match_index = array_search($residue, $nums);
if ($match_index !== false && $match_index != $i) {
return array($i, $match_index);
$map = [];
foreach($nums as $i => $num) {
if (isset($map[$target - $num])) {
return [
$i,
$map[$target - $num]
];
} else {
$map[$num] = $i;
}
}
return [];

View File

@ -74,7 +74,7 @@ public:
sort(nums.begin(), nums.end());
for (int k = 0; k < nums.size(); k++) {
// 剪枝处理
if (nums[k] > target && nums[k] >= 0 && target >= 0) {
if (nums[k] > target && nums[k] >= 0) {
break; // 这里使用break统一通过最后的return返回
}
// 对nums[k]去重
@ -83,7 +83,7 @@ public:
}
for (int i = k + 1; i < nums.size(); i++) {
// 2级剪枝处理
if (nums[k] + nums[i] > target && nums[k] + nums[i] >= 0 && target >= 0) {
if (nums[k] + nums[i] > target && nums[k] + nums[i] >= 0) {
break;
}

View File

@ -33,6 +33,9 @@
## 思路
《代码随想录》算法公开课:[链表遍历学清楚! | LeetCode19.删除链表倒数第N个节点](https://www.bilibili.com/video/BV1vW4y1U7Gf),相信结合视频在看本篇题解,更有助于大家对链表的理解。
双指针的经典应用如果要删除倒数第n个节点让fast移动n步然后让fast和slow同时移动直到fast指向链表末尾。删掉slow所指向的节点就可以了。
思路是这样的,但要注意一些细节。

View File

@ -41,6 +41,9 @@
# 思路
《代码随想录》算法视频公开课:[栈的拿手好戏!| LeetCode20. 有效的括号](https://www.bilibili.com/video/BV1AF411w78g),相信结合视频在看本篇题解,更有助于大家对链表的理解。
## 题外话
**括号匹配是使用栈解决的经典问题。**
@ -79,8 +82,10 @@ cd a/b/c/../../
1. 第一种情况,字符串里左方向的括号多余了 ,所以不匹配。
![括号匹配1](https://img-blog.csdnimg.cn/2020080915505387.png)
2. 第二种情况,括号没有多余,但是 括号的类型没有匹配上。
![括号匹配2](https://img-blog.csdnimg.cn/20200809155107397.png)
3. 第三种情况,字符串里右方向的括号多余了,所以不匹配。
![括号匹配3](https://img-blog.csdnimg.cn/20200809155115779.png)
@ -110,7 +115,8 @@ cd a/b/c/../../
class Solution {
public:
bool isValid(string s) {
stack<int> st;
if (s.size() % 2 != 0) return false; // 如果s的长度为奇数一定不符合要求
stack<char> st;
for (int i = 0; i < s.size(); i++) {
if (s[i] == '(') st.push(')');
else if (s[i] == '{') st.push('}');
@ -124,6 +130,7 @@ public:
return st.empty();
}
};
```
技巧性的东西没有固定的学习方法,还是要多看多练,自己灵活运用了。

View File

@ -18,7 +18,8 @@
## 思路
针对本题重点难点我录制了B站讲解视频[帮你把链表细节学清楚! | LeetCode24. 两两交换链表中的节点](https://www.bilibili.com/video/BV1YT411g7br),相信结合视频在看本篇题解,更有助于大家对链表的理解。
《代码随想录》算法公开课:[帮你把链表细节学清楚! | LeetCode24. 两两交换链表中的节点](https://www.bilibili.com/video/BV1YT411g7br),相信结合视频在看本篇题解,更有助于大家对链表的理解。
这道题目正常模拟就可以了。

View File

@ -178,10 +178,10 @@ class Solution:
>另一种思路
```python
class Solution:
'''
抛砖引玉因题目要求“必须原地修改只允许使用额外常数空间”python内置sorted函数以及数组切片+sort()无法使用。
故选择另一种算法暂且提供一种python思路
'''
'''
抛砖引玉因题目要求“必须原地修改只允许使用额外常数空间”python内置sorted函数以及数组切片+sort()无法使用。
故选择另一种算法暂且提供一种python思路
'''
def nextPermutation(self, nums: List[int]) -> None:
"""
Do not return anything, modify nums in-place instead.
@ -195,9 +195,9 @@ class Solution:
break
self.reverse(nums, i, length-1)
break
else:
# 若正常结束循环,则对原数组直接翻转
self.reverse(nums, 0, length-1)
if n == 1:
# 若正常结束循环,则对原数组直接翻转
self.reverse(nums, 0, length-1)
def reverse(self, nums: List[int], low: int, high: int) -> None:
while low < high:

View File

@ -488,6 +488,52 @@ function solveSudoku(board: string[][]): void {
};
```
### Rust
```Rust
impl Solution {
fn is_valid(row: usize, col: usize, val: char, board: &mut Vec<Vec<char>>) -> bool{
for i in 0..9 {
if board[row][i] == val { return false; }
}
for j in 0..9 {
if board[j][col] == val {
return false;
}
}
let start_row = (row / 3) * 3;
let start_col = (col / 3) * 3;
for i in start_row..(start_row + 3) {
for j in start_col..(start_col + 3) {
if board[i][j] == val { return false; }
}
}
return true;
}
fn backtracking(board: &mut Vec<Vec<char>>) -> bool{
for i in 0..board.len() {
for j in 0..board[0].len() {
if board[i][j] != '.' { continue; }
for k in '1'..='9' {
if Self::is_valid(i, j, k, board) {
board[i][j] = k;
if Self::backtracking(board) { return true; }
board[i][j] = '.';
}
}
return false;
}
}
return true;
}
pub fn solve_sudoku(board: &mut Vec<Vec<char>>) {
Self::backtracking(board);
}
}
```
### C
```C

View File

@ -305,6 +305,56 @@ object Solution {
}
```
### Rust
```Rust
//版本一
impl Solution {
fn max(a: i32, b:i32) -> i32 {
if a > b { a } else { b }
}
pub fn jump(nums: Vec<i32>) -> i32 {
if nums.len() == 0 { return 0; }
let mut cur_distance: i32 = 0;
let mut ans: i32 = 0;
let mut next_distance: i32 = 0;
for i in 0..nums.len() {
next_distance = Self::max(nums[i] + i as i32, next_distance);
if i as i32 == cur_distance {
if cur_distance != (nums.len() - 1) as i32 {
ans += 1;
cur_distance = next_distance;
if next_distance == (nums.len() - 1) as i32 { break; }
}
else { break; }
}
}
ans
}
}
```
```Rust
//版本二
impl Solution {
fn max(a: i32, b:i32) -> i32 {
if a > b { a } else { b }
}
pub fn jump(nums: Vec<i32>) -> i32 {
let mut cur_distance: i32 = 0;
let mut ans: i32 = 0;
let mut next_distance: i32 = 0;
for i in 0..nums.len() - 1 {
next_distance = Self::max(nums[i] + i as i32, next_distance);
if i as i32 == cur_distance {
cur_distance = next_distance;
ans += 1;
}
}
ans
}
}
```
-----------------------

View File

@ -558,6 +558,56 @@ func solveNQueens(_ n: Int) -> [[String]] {
}
```
### Rust
```Rust
impl Solution {
fn is_valid(row: usize, col: usize, chessboard: &mut Vec<Vec<char>>, n: usize) -> bool {
let mut i = 0 as usize;
while i < row {
if chessboard[i][col] == 'Q' { return false; }
i += 1;
}
let (mut i, mut j) = (row as i32 - 1, col as i32 - 1);
while i >= 0 && j >= 0 {
if chessboard[i as usize][j as usize] == 'Q' { return false; }
i -= 1;
j -= 1;
}
let (mut i, mut j) = (row as i32 - 1, col as i32 + 1);
while i >= 0 && j < n as i32 {
if chessboard[i as usize][j as usize] == 'Q' { return false; }
i -= 1;
j += 1;
}
return true;
}
fn backtracking(result: &mut Vec<Vec<String>>, n: usize, row: usize, chessboard: &mut Vec<Vec<char>>) {
if row == n {
let mut chessboard_clone: Vec<String> = Vec::new();
for i in chessboard {
chessboard_clone.push(i.iter().collect::<String>());
}
result.push(chessboard_clone);
return;
}
for col in 0..n {
if Self::is_valid(row, col, chessboard, n) {
chessboard[row][col] = 'Q';
Self::backtracking(result, n, row + 1, chessboard);
chessboard[row][col] = '.';
}
}
}
pub fn solve_n_queens(n: i32) -> Vec<Vec<String>> {
let mut result: Vec<Vec<String>> = Vec::new();
let mut chessboard: Vec<Vec<char>> = vec![vec!['.'; n as usize]; n as usize];
Self::backtracking(&mut result, n as usize, 0, &mut chessboard);
result
}
}
```
### C
```c
char ***ans;

View File

@ -4,7 +4,7 @@
</a>
<p align="center"><strong><a href="https://mp.weixin.qq.com/s/tqCxrMEU-ajQumL1i8im9A">参与本项目</a>,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!</strong></p>
## 53. 最大子序和
# 53. 最大子序和
[力扣题目链接](https://leetcode.cn/problems/maximum-subarray/)

View File

@ -132,69 +132,6 @@ public:
* [剑指Offer 29.顺时针打印矩阵](https://leetcode.cn/problems/shun-shi-zhen-da-yin-ju-zhen-lcof/)
## 其他语言版本
Python:
```python
class Solution:
def spiralOrder(self, matrix: List[List[int]]) -> List[int]:
m, n = len(matrix), len(matrix[0])
left, right, up, down = 0, n - 1, 0, m - 1 # 定位四个方向的边界,闭区间
res = []
while True:
for i in range(left, right + 1): # 上边,从左到右
res.append(matrix[up][i])
up += 1 # 上边界下移
if len(res) >= m * n: # 判断是否已经遍历完
break
for i in range(up, down + 1): # 右边,从上到下
res.append(matrix[i][right])
right -= 1 # 右边界左移
if len(res) >= m * n:
break
for i in range(right, left - 1, -1): # 下边,从右到左
res.append(matrix[down][i])
down -= 1 # 下边界上移
if len(res) >= m * n:
break
for i in range(down, up - 1, -1): # 左边,从下到上
res.append(matrix[i][left])
left += 1 # 左边界右移
if len(res) >= m * n:
break
return res
```
```python3
class Solution:
def spiralOrder(self, matrix: List[List[int]]) -> List[int]:
r=len(matrix)
if r == 0 or len(matrix[0])==0:
return []
c=len(matrix[0])
res=matrix[0]
if r>1:
for i in range (1,r):
res.append(matrix[i][c-1])
for j in range(c-2, -1, -1):
res.append(matrix[r-1][j])
if c>1:
for i in range(r-2, 0, -1):
res.append(matrix[i][0])
M=[]
for k in range(1, r-1):
e=matrix[k][1:-1]
M.append(e)
return res+self.spiralOrder(M)
```
-----------------------
<div align="center"><img src=https://code-thinking.cdn.bcebos.com/pics/01二维码一.jpg width=500> </img></div>

View File

@ -154,6 +154,26 @@ var canJump = function(nums) {
};
```
### Rust
```Rust
impl Solution {
fn max(a: usize, b: usize) -> usize {
if a > b { a } else { b }
}
pub fn can_jump(nums: Vec<i32>) -> bool {
let mut cover = 0;
if (nums.len() == 1) { return true; }
let mut i = 0;
while i <= cover {
cover = Self::max(i + nums[i] as usize, cover);
if cover >= nums.len() - 1 { return true; }
i += 1;
}
false
}
}
```
### C
```c

View File

@ -329,5 +329,31 @@ object Solution {
}
```
### Rust
```Rust
impl Solution {
fn max(a: i32, b: i32) -> i32 {
if a > b { a } else { b }
}
pub fn merge(intervals: Vec<Vec<i32>>) -> Vec<Vec<i32>> {
let mut intervals = intervals;
let mut result = Vec::new();
if intervals.len() == 0 { return result; }
intervals.sort_by(|a, b| a[0].cmp(&b[0]));
result.push(intervals[0].clone());
for i in 1..intervals.len() {
if result.last_mut().unwrap()[1] >= intervals[i][0] {
result.last_mut().unwrap()[1] = Self::max(result.last_mut().unwrap()[1], intervals[i][1]);
} else {
result.push(intervals[i].clone());
}
}
result
}
}
```
-----------------------
<div align="center"><img src=https://code-thinking.cdn.bcebos.com/pics/01二维码一.jpg width=500> </img></div>

View File

@ -4,7 +4,7 @@
</a>
<p align="center"><strong><a href="https://mp.weixin.qq.com/s/tqCxrMEU-ajQumL1i8im9A">参与本项目</a>,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!</strong></p>
## 72. 编辑距离
# 72. 编辑距离
[力扣题目链接](https://leetcode.cn/problems/edit-distance/)

View File

@ -240,6 +240,20 @@ Go
JavaScript
> 递归法
```javascript
var isSameTree = function (p, q) {
if (p == null && q == null)
return true;
if (p == null || q == null)
return false;
if (p.val != q.val)
return false;
return isSameTree(p.left, q.left) && isSameTree(p.right, q.right);
};
```
TypeScript:
> 递归法-先序遍历

View File

@ -205,6 +205,36 @@ class Solution {
go:
```go
/**
102. 二叉树的递归遍历
*/
func levelOrder(root *TreeNode) [][]int {
arr := [][]int{}
depth := 0
var order func(root *TreeNode, depth int)
order = func(root *TreeNode, depth int) {
if root == nil {
return
}
if len(arr) == depth {
arr = append(arr, []int{})
}
arr[depth] = append(arr[depth], root.Val)
order(root.Left, depth+1)
order(root.Right, depth+1)
}
order(root, depth)
return arr
}
```
```go
/**
102. 二叉树的层序遍历

View File

@ -4,7 +4,7 @@
</a>
<p align="center"><strong><a href="https://mp.weixin.qq.com/s/tqCxrMEU-ajQumL1i8im9A">参与本项目</a>,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!</strong></p>
## 115.不同的子序列
# 115.不同的子序列
[力扣题目链接](https://leetcode.cn/problems/distinct-subsequences/)

View File

@ -4,7 +4,7 @@
</a>
<p align="center"><strong><a href="https://mp.weixin.qq.com/s/tqCxrMEU-ajQumL1i8im9A">参与本项目</a>,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!</strong></p>
## 121. 买卖股票的最佳时机
# 121. 买卖股票的最佳时机
[力扣题目链接](https://leetcode.cn/problems/best-time-to-buy-and-sell-stock/)

View File

@ -282,6 +282,43 @@ function maxProfit(prices: number[]): number {
};
```
### Rust
贪心:
```Rust
impl Solution {
fn max(a: i32, b: i32) -> i32 {
if a > b { a } else { b }
}
pub fn max_profit(prices: Vec<i32>) -> i32 {
let mut result = 0;
for i in 1..prices.len() {
result += Self::max(prices[i] - prices[i - 1], 0);
}
result
}
}
```
动态规划:
```Rust
impl Solution {
fn max(a: i32, b: i32) -> i32 {
if a > b { a } else { b }
}
pub fn max_profit(prices: Vec<i32>) -> i32 {
let n = prices.len();
let mut dp = vec![vec![0; 2]; n];
dp[0][0] -= prices[0];
for i in 1..n {
dp[i][0] = Self::max(dp[i - 1][0], dp[i - 1][1] - prices[i]);
dp[i][1] = Self::max(dp[i - 1][1], dp[i - 1][0] + prices[i]);
}
Self::max(dp[n - 1][0], dp[n - 1][1])
}
}
```
### C:
贪心:
```c

View File

@ -4,7 +4,7 @@
</a>
<p align="center"><strong><a href="https://mp.weixin.qq.com/s/tqCxrMEU-ajQumL1i8im9A">参与本项目</a>,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!</strong></p>
## 122.买卖股票的最佳时机II
# 122.买卖股票的最佳时机II
[力扣题目链接](https://leetcode.cn/problems/best-time-to-buy-and-sell-stock-ii/)

View File

@ -4,7 +4,7 @@
</a>
<p align="center"><strong><a href="https://mp.weixin.qq.com/s/tqCxrMEU-ajQumL1i8im9A">参与本项目</a>,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!</strong></p>
## 123.买卖股票的最佳时机III
# 123.买卖股票的最佳时机III
[力扣题目链接](https://leetcode.cn/problems/best-time-to-buy-and-sell-stock-iii/)

View File

@ -405,6 +405,55 @@ function canCompleteCircuit(gas: number[], cost: number[]): number {
};
```
### Rust
贪心算法:方法一
```Rust
impl Solution {
pub fn can_complete_circuit(gas: Vec<i32>, cost: Vec<i32>) -> i32 {
let mut cur_sum = 0;
let mut min = i32::MAX;
for i in 0..gas.len() {
let rest = gas[i] - cost[i];
cur_sum += rest;
if cur_sum < min { min = cur_sum; }
}
if cur_sum < 0 { return -1; }
if min > 0 { return 0; }
for i in (0..gas.len()).rev() {
let rest = gas[i] - cost[i];
min += rest;
if min >= 0 { return i as i32; }
}
-1
}
}
```
贪心算法:方法二
```Rust
impl Solution {
pub fn can_complete_circuit(gas: Vec<i32>, cost: Vec<i32>) -> i32 {
let mut cur_sum = 0;
let mut total_sum = 0;
let mut start = 0;
for i in 0..gas.len() {
cur_sum += gas[i] - cost[i];
total_sum += gas[i] - cost[i];
if cur_sum < 0 {
start = i + 1;
cur_sum = 0;
}
}
if total_sum < 0 { return -1; }
start as i32
}
}
```
### C
贪心算法:方法一

View File

@ -24,7 +24,8 @@
## 思路
为了易于大家理解,我录制讲解视频:[B站把环形链表讲清楚 ](https://www.bilibili.com/video/BV1if4y1d7ob)结合视频在看本篇题解,事半功倍
《代码随想录》算法公开课:[把环形链表讲清楚!| LeetCode:142.环形链表II](https://www.bilibili.com/video/BV1if4y1d7ob),相信结合视频在看本篇题解,更有助于大家对链表的理解
这道题目,不仅考察对链表的操作,而且还需要一些数学运算。

View File

@ -4,7 +4,7 @@
</a>
<p align="center"><strong><a href="https://mp.weixin.qq.com/s/tqCxrMEU-ajQumL1i8im9A">参与本项目</a>,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!</strong></p>
## 188.买卖股票的最佳时机IV
# 188.买卖股票的最佳时机IV
[力扣题目链接](https://leetcode.cn/problems/best-time-to-buy-and-sell-stock-iv/)

View File

@ -4,7 +4,7 @@
</a>
<p align="center"><strong><a href="https://mp.weixin.qq.com/s/tqCxrMEU-ajQumL1i8im9A">参与本项目</a>,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!</strong></p>
## 198.打家劫舍
# 198.打家劫舍
[力扣题目链接](https://leetcode.cn/problems/house-robber/)

View File

@ -4,7 +4,7 @@
</a>
<p align="center"><strong><a href="https://mp.weixin.qq.com/s/tqCxrMEU-ajQumL1i8im9A">参与本项目</a>,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!</strong></p>
## 213.打家劫舍II
# 213.打家劫舍II
[力扣题目链接](https://leetcode.cn/problems/house-robber-ii/)

View File

@ -28,6 +28,10 @@
# 思路
《代码随想录》算法公开课:[队列的基本操作! | LeetCode225. 用队列实现栈](https://www.bilibili.com/video/BV1Fd4y1K7sm),相信结合视频在看本篇题解,更有助于大家对链表的理解。
(这里要强调是单向队列)
有的同学可能疑惑这种题目有什么实际工程意义,**其实很多算法题目主要是对知识点的考察和教学意义远大于其工程实践的意义,所以面试题也是这样!**

View File

@ -38,6 +38,9 @@ queue.empty(); // 返回 false
## 思路
《代码随想录》算法公开课:[栈的基本操作! | LeetCode232.用栈实现队列](https://www.bilibili.com/video/BV1nY4y1w7VC),相信结合视频在看本篇题解,更有助于大家对链表的理解。
这是一道模拟题,不涉及到具体算法,考察的就是对栈和队列的掌握程度。
使用栈来模式队列的行为,如果仅仅用一个栈,是一定不行的,所以需要两个栈**一个输入栈,一个输出栈**,这里要注意输入栈和输出栈的关系。
@ -170,14 +173,6 @@ class MyQueue {
}
}
/**
* Your MyQueue object will be instantiated and called as such:
* MyQueue obj = new MyQueue();
* obj.push(x);
* int param_2 = obj.pop();
* int param_3 = obj.peek();
* boolean param_4 = obj.empty();
*/
```

View File

@ -36,7 +36,7 @@
难点是如何求一个区间里的最大值呢? (这好像是废话),暴力一下不就得了。
暴力方法,遍历一遍的过程中每次从窗口中在找到最大的数值,这样很明显是$O(n × k)$的算法。
暴力方法遍历一遍的过程中每次从窗口中在找到最大的数值这样很明显是O(n × k)的算法。
有的同学可能会想用一个大顶堆优先级队列来存放这个窗口里的k个数字这样就可以知道最大的最大值是多少了 **但是问题是这个窗口是移动的,而大顶堆每次只能弹出最大值,我们无法移除其他数值,这样就造成大顶堆维护的不是滑动窗口里面的数值了。所以不能用大顶堆。**
@ -183,13 +183,13 @@ public:
};
```
在来看一下时间复杂度,使用单调队列的时间复杂度是 $O(n)$
在来看一下时间复杂度,使用单调队列的时间复杂度是 O(n)。
有的同学可能想了,在队列中 push元素的过程中还有pop操作呢感觉不是纯粹的$O(n)$
有的同学可能想了,在队列中 push元素的过程中还有pop操作呢感觉不是纯粹的O(n)。
其实大家可以自己观察一下单调队列的实现nums 中的每个元素最多也就被 push_back 和 pop_back 各一次,没有任何多余操作,所以整体的复杂度还是 $O(n)$
其实大家可以自己观察一下单调队列的实现nums 中的每个元素最多也就被 push_back 和 pop_back 各一次,没有任何多余操作,所以整体的复杂度还是 O(n)。
空间复杂度因为我们定义一个辅助队列,所以是$O(k)$
空间复杂度因为我们定义一个辅助队列所以是O(k)。
# 扩展

View File

@ -4,7 +4,7 @@
</a>
<p align="center"><strong><a href="https://mp.weixin.qq.com/s/tqCxrMEU-ajQumL1i8im9A">参与本项目</a>,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!</strong></p>
## 300.最长递增子序列
# 300.最长递增子序列
[力扣题目链接](https://leetcode.cn/problems/longest-increasing-subsequence/)

View File

@ -4,7 +4,7 @@
</a>
<p align="center"><strong><a href="https://mp.weixin.qq.com/s/tqCxrMEU-ajQumL1i8im9A">参与本项目</a>,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!</strong></p>
## 309.最佳买卖股票时机含冷冻期
# 309.最佳买卖股票时机含冷冻期
[力扣题目链接](https://leetcode.cn/problems/best-time-to-buy-and-sell-stock-with-cooldown/)

View File

@ -742,5 +742,33 @@ func (p ticketSlice) Swap(i, j int) { p[i], p[j] = p[j], p[i] }
```
### Rust
** 文中的Hashmap嵌套Hashmap的方法因为Rust的所有权问题暂时无法实现此方法为删除哈希表中元素法 **
```Rust
use std::collections::HashMap;
impl Solution {
fn backtracking(airport: String, targets: &mut HashMap<&String, Vec<&String>>, result: &mut Vec<String>) {
while let Some(next_airport) = targets.get_mut(&airport).unwrap_or(&mut vec![]).pop() {
Self::backtracking(next_airport.clone(), targets, result);
}
result.push(airport.clone());
}
pub fn find_itinerary(tickets: Vec<Vec<String>>) -> Vec<String> {
let mut targets: HashMap<&String, Vec<&String>> = HashMap::new();
let mut result = Vec::new();
for t in 0..tickets.len() {
targets.entry(&tickets[t][0]).or_default().push(&tickets[t][1]);
}
for (_, target) in targets.iter_mut() {
target.sort_by(|a, b| b.cmp(a));
}
Self::backtracking("JFK".to_string(), &mut targets, &mut result);
result.reverse();
result
}
}
```
-----------------------
<div align="center"><img src=https://code-thinking.cdn.bcebos.com/pics/01二维码一.jpg width=500> </img></div>

View File

@ -5,7 +5,7 @@
<p align="center"><strong><a href="https://mp.weixin.qq.com/s/tqCxrMEU-ajQumL1i8im9A">参与本项目</a>,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!</strong></p>
## 337.打家劫舍 III
# 337.打家劫舍 III
[力扣题目链接](https://leetcode.cn/problems/house-robber-iii/)
@ -190,9 +190,9 @@ public:
if (cur == NULL) return vector<int>{0, 0};
vector<int> left = robTree(cur->left);
vector<int> right = robTree(cur->right);
// 偷cur
int val1 = cur->val + left[0] + right[0];
// 不偷cur
// 偷cur,那么就不能偷左右节点。
int val1 = cur->val + left[1] + right[1];
// 不偷cur,那么可以偷也可以不偷左右节点,则取较大的情况
int val2 = max(left[0], left[1]) + max(right[0], right[1]);
return {val2, val1};
}
@ -353,18 +353,30 @@ class Solution:
# self.left = left
# self.right = right
class Solution:
def rob(self, root: TreeNode) -> int:
result = self.rob_tree(root)
return max(result[0], result[1])
def rob_tree(self, node):
if node is None:
return (0, 0) # (偷当前节点金额,不偷当前节点金额)
left = self.rob_tree(node.left)
right = self.rob_tree(node.right)
val1 = node.val + left[1] + right[1] # 偷当前节点,不能偷子节点
val2 = max(left[0], left[1]) + max(right[0], right[1]) # 不偷当前节点,可偷可不偷子节点
return (val1, val2)
def rob(self, root: Optional[TreeNode]) -> int:
# dp数组dp table以及下标的含义
# 1. 下标为 0 记录 **不偷该节点** 所得到的的最大金钱
# 2. 下标为 1 记录 **偷该节点** 所得到的的最大金钱
dp = self.traversal(root)
return max(dp)
# 要用后序遍历, 因为要通过递归函数的返回值来做下一步计算
def traversal(self, node):
# 递归终止条件,就是遇到了空节点,那肯定是不偷的
if not node:
return (0, 0)
left = self.traversal(node.left)
right = self.traversal(node.right)
# 不偷当前节点, 偷子节点
val_0 = max(left[0], left[1]) + max(right[0], right[1])
# 偷当前节点, 不偷子节点
val_1 = node.val + left[0] + right[0]
return (val_0, val_1)
```
### Go

View File

@ -5,7 +5,7 @@
<p align="center"><strong><a href="https://mp.weixin.qq.com/s/tqCxrMEU-ajQumL1i8im9A">参与本项目</a>,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!</strong></p>
## 392.判断子序列
# 392.判断子序列
[力扣题目链接](https://leetcode.cn/problems/is-subsequence/)

View File

@ -290,6 +290,26 @@ var reconstructQueue = function(people) {
};
```
### Rust
```Rust
impl Solution {
pub fn reconstruct_queue(people: Vec<Vec<i32>>) -> Vec<Vec<i32>> {
let mut people = people;
people.sort_by(|a, b| {
if a[0] == b[0] { return a[1].cmp(&b[1]); }
b[0].cmp(&a[0])
});
let mut que: Vec<Vec<i32>> = Vec::new();
que.push(people[0].clone());
for i in 1..people.len() {
let position = people[i][1];
que.insert(position as usize, people[i].clone());
}
que
}
}
```
### C
```c

View File

@ -374,7 +374,26 @@ object Solution {
}
```
### Rust
```Rust
impl Solution {
pub fn erase_overlap_intervals(intervals: Vec<Vec<i32>>) -> i32 {
if intervals.len() == 0 { return 0; }
let mut intervals = intervals;
intervals.sort_by(|a, b| a[1].cmp(&b[1]));
let mut count = 1;
let mut end = intervals[0][1];
for i in 1..intervals.len() {
if end <= intervals[i][0] {
end = intervals[i][1];
count += 1;
}
}
intervals.len() as i32 - count
}
}
```
-----------------------

View File

@ -150,6 +150,7 @@ class Solution {
int count = 1;
//重叠气球的最小右边界
int leftmostRightBound = points[0][1];
for (int i = 1; i < points.length; i++) {
//如果下一个气球的左边界大于最小右边界
for(int i = 1; i < points.length; i++){
if (points[i][0] > leftmostRightBound ) {

View File

@ -31,13 +31,16 @@
# 思路
针对本题,我录制了视频讲解:[字符串这么玩,可有点难度! | LeetCode459.重复的子字符串](https://www.bilibili.com/video/BV1cg41127fw),结合本题解一起看,事半功倍!
暴力的解法, 就是一个for循环获取 子串的终止位置, 然后判断子串是否能重复构成字符串又嵌套一个for循环所以是O(n^2)的时间复杂度。
有的同学可以想怎么一个for循环就可以获取子串吗 至少得一个for获取子串起始位置一个for获取子串结束位置吧。
其实我们只需要判断以第一个字母为开始的子串就可以所以一个for循环获取子串的终止位置就行了。 而且遍历的时候 都不用遍历结束,只需要遍历到中间位置,因为子串结束位置大于中间位置的话,一定不能重复组成字符串。
暴力的解法,这里就不了。
暴力的解法,这里就不详细讲解了。
主要讲一讲移动匹配 和 KMP两种方法。

View File

@ -4,7 +4,8 @@
</a>
<p align="center"><strong><a href="https://mp.weixin.qq.com/s/tqCxrMEU-ajQumL1i8im9A">参与本项目</a>,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!</strong></p>
## 516.最长回文子序列
# 516.最长回文子序列
[力扣题目链接](https://leetcode.cn/problems/longest-palindromic-subsequence/)
给定一个字符串 s ,找到其中最长的回文子序列,并返回该序列的长度。可以假设 s 的最大长度为 1000 。

View File

@ -4,7 +4,7 @@
</a>
<p align="center"><strong><a href="https://mp.weixin.qq.com/s/tqCxrMEU-ajQumL1i8im9A">参与本项目</a>,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!</strong></p>
## 583. 两个字符串的删除操作
# 583. 两个字符串的删除操作
[力扣题目链接](https://leetcode.cn/problems/delete-operation-for-two-strings/)

View File

@ -4,7 +4,7 @@
</a>
<p align="center"><strong><a href="https://mp.weixin.qq.com/s/tqCxrMEU-ajQumL1i8im9A">参与本项目</a>,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!</strong></p>
## 647. 回文子串
# 647. 回文子串
[力扣题目链接](https://leetcode.cn/problems/palindromic-substrings/)

View File

@ -4,7 +4,7 @@
</a>
<p align="center"><strong><a href="https://mp.weixin.qq.com/s/tqCxrMEU-ajQumL1i8im9A">参与本项目</a>,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!</strong></p>
## 674. 最长连续递增序列
# 674. 最长连续递增序列
[力扣题目链接](https://leetcode.cn/problems/longest-continuous-increasing-subsequence/)

View File

@ -4,7 +4,7 @@
</a>
<p align="center"><strong><a href="https://mp.weixin.qq.com/s/tqCxrMEU-ajQumL1i8im9A">参与本项目</a>,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!</strong></p>
## 714.买卖股票的最佳时机含手续费
# 714.买卖股票的最佳时机含手续费
[力扣题目链接](https://leetcode.cn/problems/best-time-to-buy-and-sell-stock-with-transaction-fee/)

View File

@ -4,7 +4,7 @@
</a>
<p align="center"><strong><a href="https://mp.weixin.qq.com/s/tqCxrMEU-ajQumL1i8im9A">参与本项目</a>,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!</strong></p>
## 718. 最长重复子数组
# 718. 最长重复子数组
[力扣题目链接](https://leetcode.cn/problems/maximum-length-of-repeated-subarray/)

View File

@ -343,6 +343,34 @@ object Solution {
}
```
### Rust
```Rust
use std::collections::HashMap;
impl Solution {
fn max (a: usize, b: usize) -> usize {
if a > b { a } else { b }
}
pub fn partition_labels(s: String) -> Vec<i32> {
let s = s.chars().collect::<Vec<char>>();
let mut hash: HashMap<char, usize> = HashMap::new();
for i in 0..s.len() {
hash.insert(s[i], i);
}
let mut result: Vec<i32> = Vec::new();
let mut left: usize = 0;
let mut right: usize = 0;
for i in 0..s.len() {
right = Self::max(right, hash[&s[i]]);
if i == right {
result.push((right - left + 1) as i32);
left = i + 1;
}
}
result
}
}
```
-----------------------
<div align="center"><img src=https://code-thinking.cdn.bcebos.com/pics/01二维码一.jpg width=500> </img></div>

View File

@ -251,6 +251,38 @@ var lemonadeChange = function(bills) {
};
```
### Rust
```Rust
impl Solution {
pub fn lemonade_change(bills: Vec<i32>) -> bool {
let mut five = 0;
let mut ten = 0;
// let mut twenty = 0;
for bill in bills {
if bill == 5 { five += 1; }
if bill == 10 {
if five <= 0 { return false; }
ten += 1;
five -= 1;
}
if bill == 20 {
if five > 0 && ten > 0 {
five -= 1;
ten -= 1;
// twenty += 1;
} else if five >= 3 {
five -= 3;
// twenty += 1;
} else { return false; }
}
}
true
}
}
```
### C
```c
bool lemonadeChange(int* bills, int billsSize){

View File

@ -227,6 +227,31 @@ var largestSumAfterKNegations = function(nums, k) {
};
```
### Rust
```Rust
impl Solution {
pub fn largest_sum_after_k_negations(nums: Vec<i32>, k: i32) -> i32 {
let mut nums = nums;
let mut k = k;
let len = nums.len();
nums.sort_by(|a, b| b.abs().cmp(&a.abs()));
for i in 0..len {
if nums[i] < 0 && k > 0 {
nums[i] *= -1;
k -= 1;
}
}
if k % 2 == 1 { nums[len - 1] *= -1; }
let mut result = 0;
for num in nums {
result += num;
}
result
}
}
```
### C
```c

View File

@ -4,7 +4,7 @@
</a>
<p align="center"><strong><a href="https://mp.weixin.qq.com/s/tqCxrMEU-ajQumL1i8im9A">参与本项目</a>,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!</strong></p>
## 1035.不相交的线
# 1035.不相交的线
[力扣题目链接](https://leetcode.cn/problems/uncrossed-lines/)

View File

@ -32,34 +32,21 @@
# 思路
## 题外话
这道题目就像是我们玩过的游戏对对碰,如果相同的元素放在挨在一起就要消除。
可能我们在玩游戏的时候感觉理所当然应该消除,但程序又怎么知道该如果消除呢,特别是消除之后又有新的元素可能挨在一起。
此时游戏的后端逻辑就可以用一个栈来实现(我没有实际考察对对碰或者爱消除游戏的代码实现,仅从原理上进行推断)。
游戏开发可能使用栈结构,编程语言的一些功能实现也会使用栈结构,实现函数递归调用就需要栈,但不是每种编程语言都支持递归,例如:
![1047.删除字符串中的所有相邻重复项](https://img-blog.csdnimg.cn/20210309093252776.png)
**递归的实现就是:每一次递归调用都会把函数的局部变量、参数值和返回地址等压入调用栈中**,然后递归返回的时候,从栈顶弹出上一次递归的各项参数,所以这就是递归为什么可以返回上一层位置的原因。
相信大家应该遇到过一种错误就是栈溢出,系统输出的异常是`Segmentation fault`(当然不是所有的`Segmentation fault` 都是栈溢出导致的) ,如果你使用了递归,就要想一想是不是无限递归了,那么系统调用栈就会溢出。
而且**在企业项目开发中,尽量不要使用递归!**在项目比较大的时候由于参数多全局变量等等使用递归很容易判断不充分return的条件非常容易无限递归或者递归层级过深**造成栈溢出错误(这种问题还不好排查!)**
好了题外话over我们进入正题。
《代码随想录》算法视频公开课:[栈的好戏还要继续!| LeetCode1047. 删除字符串中的所有相邻重复项](https://www.bilibili.com/video/BV12a411P7mw),相信结合视频在看本篇题解,更有助于大家对本题的理解。
## 正题
本题要删除相邻相同元素,其实也是匹配问题,相同左元素相当于左括号,相同右元素就是相当于右括号,匹配上了就删除。
本题要删除相邻相同元素,相对于[20. 有效的括号](https://programmercarl.com/0020.%E6%9C%89%E6%95%88%E7%9A%84%E6%8B%AC%E5%8F%B7.html)来说其实也是匹配问题20. 有效的括号 是匹配左右括号,本题是匹配相邻元素,最后都是做消除的操作。
那么再来看一下本题:可以把字符串顺序放到一个栈中,然后如果相同的话 栈就弹出,这样最后栈里剩下的元素都是相邻不相同的元素了
本题也是用栈来解决的经典题目
那么栈里应该放的是什么元素呢?
如动画所示:
我们在删除相邻重复项的时候,其实就是要知道当前遍历的这个元素,我们在前一位是不是遍历过一样数值的元素,那么如何记录前面遍历过的元素呢?
所以就是用栈来存放,那么栈的目的,就是存放遍历过的元素,当遍历当前的这个元素的时候,去栈里看一下我们是不是遍历过相同数值的相邻元素。
然后再去做对应的消除操作。 如动画所示:
![1047.删除字符串中的所有相邻重复项](https://code-thinking.cdn.bcebos.com/gifs/1047.删除字符串中的所有相邻重复项.gif)
@ -113,6 +100,22 @@ public:
};
```
## 题外话
这道题目就像是我们玩过的游戏对对碰,如果相同的元素放在挨在一起就要消除。
可能我们在玩游戏的时候感觉理所当然应该消除,但程序又怎么知道该如果消除呢,特别是消除之后又有新的元素可能挨在一起。
此时游戏的后端逻辑就可以用一个栈来实现(我没有实际考察对对碰或者爱消除游戏的代码实现,仅从原理上进行推断)。
游戏开发可能使用栈结构,编程语言的一些功能实现也会使用栈结构,实现函数递归调用就需要栈,但不是每种编程语言都支持递归,例如:
**递归的实现就是:每一次递归调用都会把函数的局部变量、参数值和返回地址等压入调用栈中**,然后递归返回的时候,从栈顶弹出上一次递归的各项参数,所以这就是递归为什么可以返回上一层位置的原因。
相信大家应该遇到过一种错误就是栈溢出,系统输出的异常是`Segmentation fault`(当然不是所有的`Segmentation fault` 都是栈溢出导致的) ,如果你使用了递归,就要想一想是不是无限递归了,那么系统调用栈就会溢出。
而且**在企业项目开发中,尽量不要使用递归**在项目比较大的时候由于参数多全局变量等等使用递归很容易判断不充分return的条件非常容易无限递归或者递归层级过深**造成栈溢出错误(这种问题还不好排查!)**
## 其他语言版本
@ -195,7 +198,7 @@ class Solution {
Python
```python
# 方法一,使用栈,推荐!
# 方法一,使用栈
class Solution:
def removeDuplicates(self, s: str) -> str:
res = list()

View File

@ -4,7 +4,7 @@
</a>
<p align="center"><strong><a href="https://mp.weixin.qq.com/s/tqCxrMEU-ajQumL1i8im9A">参与本项目</a>,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!</strong></p>
## 1143.最长公共子序列
# 1143.最长公共子序列
[力扣题目链接](https://leetcode.cn/problems/longest-common-subsequence/)

View File

@ -57,11 +57,18 @@ TreeNode* construct_binary_tree(const vector<int>& vec) {
if (i == 0) root = node;
}
// 遍历一遍,根据规则左右孩子赋值就可以了
// 注意这里 结束规则是 i * 2 + 2 < vec.size(),避免空指针
for (int i = 0; i * 2 + 2 < vec.size(); i++) {
// 注意这里 结束规则是 i * 2 + 1 < vec.size(),避免空指针
// 为什么结束规则不能是i * 2 + 2 < arr.length呢?
// 如果i * 2 + 2 < arr.length 是结束条件
// 那么i * 2 + 1这个符合条件的节点就被忽略掉了
// 例如[2,7,9,-1,1,9,6,-1,-1,10] 这样的一个二叉树,最后的10就会被忽略掉
// 遍历一遍,根据规则左右孩子赋值就可以了
for (int i = 0; i * 2 + 1 < vec.size(); i++) {
if (vecTree[i] != NULL) {
// 线性存储转连式存储关键逻辑
vecTree[i]->left = vecTree[i * 2 + 1];
if(i * 2 + 2 < vec.size())
vecTree[i]->right = vecTree[i * 2 + 2];
}
}
@ -114,9 +121,10 @@ TreeNode* construct_binary_tree(const vector<int>& vec) {
vecTree[i] = node;
if (i == 0) root = node;
}
for (int i = 0; i * 2 + 2 < vec.size(); i++) {
for (int i = 0; i * 2 + 1 < vec.size(); i++) {
if (vecTree[i] != NULL) {
vecTree[i]->left = vecTree[i * 2 + 1];
if(i * 2 + 2 < vec.size())
vecTree[i]->right = vecTree[i * 2 + 2];
}
}
@ -213,7 +221,7 @@ public class Solution {
static class TreeNode {
// 节点值
int val;
// 左节点
TreeNode left;
@ -249,12 +257,18 @@ public class Solution {
}
}
// 遍历一遍,根据规则左右孩子赋值就可以了
// 注意这里 结束规则是 i * 2 + 2 < arr.length避免空指针
for (int i = 0; i * 2 + 2 < arr.length; i++) {
// 注意这里 结束规则是 i * 2 + 1 < arr.length避免空指针
// 为什么结束规则不能是i * 2 + 2 < arr.length呢?
// 如果i * 2 + 2 < arr.length 是结束条件
// 那么i * 2 + 1这个符合条件的节点就被忽略掉了
// 例如[2,7,9,-1,1,9,6,-1,-1,10] 这样的一个二叉树,最后的10就会被忽略掉
for (int i = 0; i * 2 + 1 < arr.length; i++) {
TreeNode node = treeNodeList.get(i);
if (node != null) {
// 线性存储转连式存储关键逻辑
node.left = treeNodeList.get(2 * i + 1);
// 再次判断下 不忽略任何一个节点
if(i * 2 + 2 < arr.length)
node.right = treeNodeList.get(2 * i + 2);
}
}

View File

@ -22,7 +22,7 @@
* 深信服(总部深圳)
* 大疆(总部深圳,无人机巨头)
* 一加手机(总部深圳)
* 柔宇科技(国内领先的柔性屏幕制造商,最近正在准备上市
* 柔宇科技(最近口碑急转直下
## 二线大厂
@ -66,7 +66,7 @@
## 其他行业(有软件/互联网业务)
* 三大电信运营商:中国移动、中国电信、中国联通
* 房产企业:恒大、万科
* 房产企业:恒大(暴雷)、万科
* 中信深圳
* 广发证券,深交所
* 珍爱网(珍爱网是国内知名的婚恋服务网站之一)

View File

@ -263,6 +263,13 @@ function reverseLeftWords(s: string, n: number): string {
return strArr.join('');
};
```
方法二:
```typescript
// 拼接两个字符串,截取符合要求的部分
function reverseLeftWords(s: string, n: number): string {
return (s+s).slice(n,s.length+n);
};
```
Swift:

View File

@ -4,6 +4,8 @@
</a>
<p align="center"><strong><a href="https://mp.weixin.qq.com/s/tqCxrMEU-ajQumL1i8im9A">参与本项目</a>,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!</strong></p>
# Leetcode股票问题总结篇!
之前我们已经把力扣上股票系列的题目都讲过的,但没有来一篇股票总结,来帮大家高屋建瓴,所以总结篇这就来了!
![股票问题总结](https://code-thinking.cdn.bcebos.com/pics/%E8%82%A1%E7%A5%A8%E9%97%AE%E9%A2%98%E6%80%BB%E7%BB%93.jpg)

View File

@ -5,6 +5,7 @@
<p align="center"><strong><a href="https://mp.weixin.qq.com/s/tqCxrMEU-ajQumL1i8im9A">参与本项目</a>,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!</strong></p>
# 动态规划最强总结篇!
如今动态规划已经讲解了42道经典题目共50篇文章是时候做一篇总结了。

View File

@ -3,6 +3,8 @@
<img src="https://code-thinking-1253855093.file.myqcloud.com/pics/20210924105952.png" width="1000"/>
</a>
<p align="center"><strong><a href="https://mp.weixin.qq.com/s/tqCxrMEU-ajQumL1i8im9A">参与本项目</a>,贡献其他语言版本的代码,拥抱开源,让更多学习算法的小伙伴们收益!</strong></p>
# 动态规划:关于完全背包,你该了解这些!
## 完全背包