From 426b00a4e2889bb4c6d2599f29c965e173a5f536 Mon Sep 17 00:00:00 2001
From: Nada
Date: Sun, 10 Apr 2022 14:56:56 +0800
Subject: [PATCH 01/40] =?UTF-8?q?Update=200018.=E5=9B=9B=E6=95=B0=E4=B9=8B?=
=?UTF-8?q?=E5=92=8C.md?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
增加剪枝逻辑处理
---
problems/0018.四数之和.md | 15 ++++++++++-----
1 file changed, 10 insertions(+), 5 deletions(-)
diff --git a/problems/0018.四数之和.md b/problems/0018.四数之和.md
index 7304254e..ee70cb69 100644
--- a/problems/0018.四数之和.md
+++ b/problems/0018.四数之和.md
@@ -31,7 +31,7 @@
四数之和,和[15.三数之和](https://programmercarl.com/0015.三数之和.html)是一个思路,都是使用双指针法, 基本解法就是在[15.三数之和](https://programmercarl.com/0015.三数之和.html) 的基础上再套一层for循环。
-但是有一些细节需要注意,例如: 不要判断`nums[k] > target` 就返回了,三数之和 可以通过 `nums[i] > 0` 就返回了,因为 0 已经是确定的数了,四数之和这道题目 target是任意值。(大家亲自写代码就能感受出来)
+但是有一些细节需要注意,例如: 不要判断`nums[k] > target` 就返回了,三数之和 可以通过 `nums[i] > 0` 就返回了,因为 0 已经是确定的数了,四数之和这道题目 target是任意值。比如:数组是`[-4, -3, -2, -1]`,`target`是`-10`,不能因为`-4 > -10`而跳过。但是我们依旧可以去做剪枝,逻辑变成`nums[i] > target && (nums[i] >=0 || target >= 0)`就可以了。
[15.三数之和](https://programmercarl.com/0015.三数之和.html)的双指针解法是一层for循环num[i]为确定值,然后循环内有left和right下标作为双指针,找到nums[i] + nums[left] + nums[right] == 0。
@@ -72,15 +72,20 @@ public:
vector> result;
sort(nums.begin(), nums.end());
for (int k = 0; k < nums.size(); k++) {
- // 这种剪枝是错误的,这道题目target 是任意值
- // if (nums[k] > target) {
- // return result;
- // }
+ // 剪枝处理
+ if (nums[k] > target && (nums[k] >= 0 || target >= 0)) {
+ break; // 这里使用break,统一通过最后的return返回
+ }
// 去重
if (k > 0 && nums[k] == nums[k - 1]) {
continue;
}
for (int i = k + 1; i < nums.size(); i++) {
+ // 2级剪枝处理
+ if (nums[k] + nums[i] > target && (nums[k] + nums[i] >= 0 || target >= 0)) {
+ break;
+ }
+
// 正确去重方法
if (i > k + 1 && nums[i] == nums[i - 1]) {
continue;
From f9146a3b98fd46ca548c8852bf3b7df0625cfe72 Mon Sep 17 00:00:00 2001
From: zhenghao <1650937065@qq.com>
Date: Wed, 20 Apr 2022 10:23:18 +0800
Subject: [PATCH 02/40] =?UTF-8?q?=E6=9B=B4=E6=96=B00435=20=E6=97=A0?=
=?UTF-8?q?=E9=87=8D=E5=8F=A0=E5=8C=BA=E9=97=B4=20java=E7=89=88=E6=9C=AC?=
=?UTF-8?q?=E5=8F=B3=E8=BE=B9=E7=95=8C=E8=A7=A3=E6=B3=95=E4=B8=AD=E6=8E=92?=
=?UTF-8?q?=E5=BA=8F=E7=9A=84=E5=88=A4=E6=96=AD=E9=80=BB=E8=BE=91?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
problems/0435.无重叠区间.md | 5 +++--
1 file changed, 3 insertions(+), 2 deletions(-)
diff --git a/problems/0435.无重叠区间.md b/problems/0435.无重叠区间.md
index b24ca024..cf58b9e2 100644
--- a/problems/0435.无重叠区间.md
+++ b/problems/0435.无重叠区间.md
@@ -184,13 +184,14 @@ public:
class Solution {
public int eraseOverlapIntervals(int[][] intervals) {
Arrays.sort(intervals, (a, b) -> {
- if (a[0] == a[0]) return a[1] - b[1];
- return a[0] - b[0];
+ // 按照区间右边界升序排序
+ return a[1] - b[1];
});
int count = 0;
int edge = Integer.MIN_VALUE;
for (int i = 0; i < intervals.length; i++) {
+ // 若上一个区间的右边界小于当前区间的左边界,说明无交集
if (edge <= intervals[i][0]) {
edge = intervals[i][1];
} else {
From 4154d3db2eadecdddaba45d09f09bfe16c0cc594 Mon Sep 17 00:00:00 2001
From: 243wresfdxvc
Date: Thu, 21 Apr 2022 09:55:19 +0000
Subject: [PATCH 03/40] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=200134.=20=E5=8A=A0?=
=?UTF-8?q?=E6=B2=B9=E7=AB=99.md=20C=E8=AF=AD=E8=A8=80=E8=B4=AA=E5=BF=83?=
=?UTF-8?q?=E8=A7=A3=E6=B3=95=E6=96=B9=E6=B3=95=E4=BA=8C?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
problems/0134.加油站.md | 32 ++++++++++++++++++++++++++++++++
1 file changed, 32 insertions(+)
diff --git a/problems/0134.加油站.md b/problems/0134.加油站.md
index ca95af67..45e05fed 100644
--- a/problems/0134.加油站.md
+++ b/problems/0134.加油站.md
@@ -341,6 +341,7 @@ var canCompleteCircuit = function(gas, cost) {
```
### C
+贪心算法:方法一
```c
int canCompleteCircuit(int* gas, int gasSize, int* cost, int costSize){
int curSum = 0;
@@ -370,5 +371,36 @@ int canCompleteCircuit(int* gas, int gasSize, int* cost, int costSize){
}
```
+贪心算法:方法二
+```c
+int canCompleteCircuit(int* gas, int gasSize, int* cost, int costSize){
+ int curSum = 0;
+ int totalSum = 0;
+ int start = 0;
+
+ int i;
+ for(i = 0; i < gasSize; ++i) {
+ // 当前i站中加油量与耗油量的差
+ int diff = gas[i] - cost[i];
+
+ curSum += diff;
+ totalSum += diff;
+
+ // 若0到i的加油量都为负,则开始位置应为i+1
+ if(curSum < 0) {
+ curSum = 0;
+ // 当i + 1 == gasSize时,totalSum < 0(此时i为gasSize - 1),油车不可能返回原点
+ start = i + 1;
+ }
+ }
+
+ // 若总和小于0,加油车无论如何都无法返回原点。返回-1
+ if(totalSum < 0)
+ return -1;
+
+ return start;
+}
+```
+
-----------------------
From be07599474b87bf7dba3e97107b19435a304e5e7 Mon Sep 17 00:00:00 2001
From: berserk-112 <40333359+berserk-112@users.noreply.github.com>
Date: Fri, 22 Apr 2022 09:16:34 +0800
Subject: [PATCH 04/40] =?UTF-8?q?Update=200309.=E6=9C=80=E4=BD=B3=E4=B9=B0?=
=?UTF-8?q?=E5=8D=96=E8=82=A1=E7=A5=A8=E6=97=B6=E6=9C=BA=E5=90=AB=E5=86=B7?=
=?UTF-8?q?=E5=86=BB=E6=9C=9F.md?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
problems/0309.最佳买卖股票时机含冷冻期.md | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/problems/0309.最佳买卖股票时机含冷冻期.md b/problems/0309.最佳买卖股票时机含冷冻期.md
index 53caa46e..8bd2fcf8 100644
--- a/problems/0309.最佳买卖股票时机含冷冻期.md
+++ b/problems/0309.最佳买卖股票时机含冷冻期.md
@@ -214,8 +214,8 @@ class Solution {
for (int i = 2; i <= prices.length; i++) {
/*
- dp[i][0] 第i天未持有股票收益;
- dp[i][1] 第i天持有股票收益;
+ dp[i][0] 第i天持有股票收益;
+ dp[i][1] 第i天不持有股票收益;
情况一:第i天是冷静期,不能以dp[i-1][1]购买股票,所以以dp[i - 2][1]买股票,没问题
情况二:第i天不是冷静期,理论上应该以dp[i-1][1]购买股票,但是第i天不是冷静期说明,第i-1天没有卖出股票,
则dp[i-1][1]=dp[i-2][1],所以可以用dp[i-2][1]买股票,没问题
From c3f746a25d81c299ca8a3efa4fc1f9e8d45509d3 Mon Sep 17 00:00:00 2001
From: qyg <1600314850@qq.com>
Date: Fri, 22 Apr 2022 10:55:01 +0800
Subject: [PATCH 05/40] =?UTF-8?q?0209.=E9=95=BF=E5=BA=A6=E6=9C=80=E5=B0=8F?=
=?UTF-8?q?=E7=9A=84=E5=AD=90=E6=95=B0=E7=BB=84=EF=BC=9A=E8=B0=83=E6=95=B4?=
=?UTF-8?q?=E7=AC=94=E8=AF=AF?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
problems/0209.长度最小的子数组.md | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/problems/0209.长度最小的子数组.md b/problems/0209.长度最小的子数组.md
index 82a11381..23b27edd 100644
--- a/problems/0209.长度最小的子数组.md
+++ b/problems/0209.长度最小的子数组.md
@@ -112,7 +112,7 @@ public:
**一些录友会疑惑为什么时间复杂度是O(n)**。
-不要以为for里放一个while就以为是O(n^2)啊, 主要是看每一个元素被操作的次数,每个元素在滑动窗后进来操作一次,出去操作一次,每个元素都是被被操作两次,所以时间复杂度是 2 × n 也就是O(n)。
+不要以为for里放一个while就以为是O(n^2)啊, 主要是看每一个元素被操作的次数,每个元素在滑动窗后进来操作一次,出去操作一次,每个元素都是被操作两次,所以时间复杂度是 2 × n 也就是O(n)。
## 相关题目推荐
From 4d668b0efc89cd15f50dcb93da01e1ace633b07b Mon Sep 17 00:00:00 2001
From: qyg <1600314850@qq.com>
Date: Fri, 22 Apr 2022 11:02:11 +0800
Subject: [PATCH 06/40] =?UTF-8?q?0059.=E8=9E=BA=E6=97=8B=E7=9F=A9=E9=98=B5?=
=?UTF-8?q?II=EF=BC=9A=E8=B0=83=E6=95=B4=E7=AC=94=E8=AF=AF?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
problems/0059.螺旋矩阵II.md | 6 +++---
1 file changed, 3 insertions(+), 3 deletions(-)
diff --git a/problems/0059.螺旋矩阵II.md b/problems/0059.螺旋矩阵II.md
index 5c679982..1162c7eb 100644
--- a/problems/0059.螺旋矩阵II.md
+++ b/problems/0059.螺旋矩阵II.md
@@ -30,7 +30,7 @@
相信很多同学刚开始做这种题目的时候,上来就是一波判断猛如虎。
-结果运行的时候各种问题,然后开始各种修修补补,最后发现改了这里哪里有问题,改了那里这里又跑不起来了。
+结果运行的时候各种问题,然后开始各种修修补补,最后发现改了这里那里有问题,改了那里这里又跑不起来了。
大家还记得我们在这篇文章[数组:每次遇到二分法,都是一看就会,一写就废](https://programmercarl.com/0704.二分查找.html)中讲解了二分法,提到如果要写出正确的二分法一定要坚持**循环不变量原则**。
@@ -47,7 +47,7 @@
可以发现这里的边界条件非常多,在一个循环中,如此多的边界条件,如果不按照固定规则来遍历,那就是**一进循环深似海,从此offer是路人**。
-这里一圈下来,我们要画每四条边,这四条边怎么画,每画一条边都要坚持一致的左闭右开,或者左开又闭的原则,这样这一圈才能按照统一的规则画下来。
+这里一圈下来,我们要画每四条边,这四条边怎么画,每画一条边都要坚持一致的左闭右开,或者左开右闭的原则,这样这一圈才能按照统一的规则画下来。
那么我按照左闭右开的原则,来画一圈,大家看一下:
@@ -59,7 +59,7 @@
一些同学做这道题目之所以一直写不好,代码越写越乱。
-就是因为在画每一条边的时候,一会左开又闭,一会左闭右闭,一会又来左闭右开,岂能不乱。
+就是因为在画每一条边的时候,一会左开右闭,一会左闭右闭,一会又来左闭右开,岂能不乱。
代码如下,已经详细注释了每一步的目的,可以看出while循环里判断的情况是很多的,代码里处理的原则也是统一的左闭右开。
From 664746fe155a137f01c5d1478b0325c2dd8e0ffe Mon Sep 17 00:00:00 2001
From: qyg <1600314850@qq.com>
Date: Fri, 22 Apr 2022 11:21:18 +0800
Subject: [PATCH 07/40] =?UTF-8?q?=E6=95=B0=E7=BB=84=E6=80=BB=E7=BB=93?=
=?UTF-8?q?=E7=AF=87=EF=BC=9A=E8=B0=83=E6=95=B4=E7=AC=94=E8=AF=AF=EF=BC=8C?=
=?UTF-8?q?=E5=A2=9E=E5=8A=A0=E4=BA=8C=E7=BB=B4=E6=95=B0=E7=BB=84=E7=9A=84?=
=?UTF-8?q?=E5=86=85=E5=AE=B9=E6=98=AF=E9=92=88=E5=AF=B9Java=E8=AF=AD?=
=?UTF-8?q?=E8=A8=80=E7=9A=84=E9=99=90=E5=AE=9A?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
problems/数组总结篇.md | 8 ++++----
1 file changed, 4 insertions(+), 4 deletions(-)
diff --git a/problems/数组总结篇.md b/problems/数组总结篇.md
index d256298b..39fa17a6 100644
--- a/problems/数组总结篇.md
+++ b/problems/数组总结篇.md
@@ -43,19 +43,19 @@
**那么二维数组在内存的空间地址是连续的么?**
-我们来举一个例子,例如: `int[][] rating = new int[3][4];` , 这个二维数据在内存空间可不是一个 `3*4` 的连续地址空间
+我们来举一个Java的例子,例如: `int[][] rating = new int[3][4];` , 这个二维数组在内存空间可不是一个 `3*4` 的连续地址空间
看了下图,就应该明白了:
-所以**二维数据在内存中不是 `3*4` 的连续地址空间,而是四条连续的地址空间组成!**
+所以**Java的二维数组在内存中不是 `3*4` 的连续地址空间,而是四条连续的地址空间组成!**
# 数组的经典题目
在面试中,数组是必考的基础数据结构。
-其实数据的题目在思想上一般比较简单的,但是如果想高效,并不容易。
+其实数组的题目在思想上一般比较简单的,但是如果想高效,并不容易。
我们之前一共讲解了四道经典数组题目,每一道题目都代表一个类型,一种思想。
@@ -115,7 +115,7 @@
在这道题目中,我们再一次介绍到了**循环不变量原则**,其实这也是写程序中的重要原则。
-相信大家又遇到过这种情况: 感觉题目的边界调节超多,一波接着一波的判断,找边界,踩了东墙补西墙,好不容易运行通过了,代码写的十分冗余,毫无章法,其实**真正解决题目的代码都是简洁的,或者有原则性的**,大家可以在这道题目中体会到这一点。
+相信大家有遇到过这种情况: 感觉题目的边界调节超多,一波接着一波的判断,找边界,拆了东墙补西墙,好不容易运行通过了,代码写的十分冗余,毫无章法,其实**真正解决题目的代码都是简洁的,或者有原则性的**,大家可以在这道题目中体会到这一点。
# 总结
From 074937378aad536271afd42fdb5cc27a1f193f7f Mon Sep 17 00:00:00 2001
From: qyg <1600314850@qq.com>
Date: Fri, 22 Apr 2022 11:42:50 +0800
Subject: [PATCH 08/40] =?UTF-8?q?=E9=93=BE=E8=A1=A8=E7=90=86=E8=AE=BA?=
=?UTF-8?q?=E5=9F=BA=E7=A1=80=EF=BC=9A=E8=B0=83=E6=95=B4=E7=AC=94=E8=AF=AF?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
problems/链表理论基础.md | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/problems/链表理论基础.md b/problems/链表理论基础.md
index 095282f5..2fe9f14c 100644
--- a/problems/链表理论基础.md
+++ b/problems/链表理论基础.md
@@ -24,7 +24,7 @@
## 双链表
-单链表中的节点只能指向节点的下一个节点。
+单链表中的指针域只能指向节点的下一个节点。
双链表:每一个节点有两个指针域,一个指向下一个节点,一个指向上一个节点。
@@ -56,7 +56,7 @@

-这个链表起始节点为2, 终止节点为7, 各个节点分布在内存个不同地址空间上,通过指针串联在一起。
+这个链表起始节点为2, 终止节点为7, 各个节点分布在内存的不同地址空间上,通过指针串联在一起。
# 链表的定义
From 5a7e247e5f5a70c1e33dfce4cc42b498cc031f61 Mon Sep 17 00:00:00 2001
From: ChubbyPan
Date: Fri, 22 Apr 2022 07:59:32 +0000
Subject: [PATCH 09/40] update build binary tree in ACM pattern with python
---
.../前序/ACM模式如何构建二叉树.md | 56 ++++++++++++++++++-
1 file changed, 55 insertions(+), 1 deletion(-)
diff --git a/problems/前序/ACM模式如何构建二叉树.md b/problems/前序/ACM模式如何构建二叉树.md
index bd2e9780..f6ec2dd3 100644
--- a/problems/前序/ACM模式如何构建二叉树.md
+++ b/problems/前序/ACM模式如何构建二叉树.md
@@ -213,7 +213,61 @@ int main() {
## Python
-```Python
+```Python3
+class TreeNode:
+ def __init__(self, val = 0, left = None, right = None):
+ self.val = val
+ self.left = left
+ self.right = right
+
+
+# 根据数组构建二叉树
+
+def construct_binary_tree(nums: []) -> TreeNode:
+ if not nums:
+ return None
+ # 用于存放构建好的节点
+ root = TreeNode(-1)
+ Tree = []
+ # 将数组元素全部转化为树节点
+ for i in range(len(nums)):
+ if nums[i]!= -1:
+ node = TreeNode(nums[i])
+ else:
+ node = None
+ Tree.append(node)
+ if i == 0:
+ root = node
+ for i in range(len(Tree)):
+ node = Tree[i]
+ if node and (2 * i + 2) < len(Tree):
+ node.left = Tree[i * 2 + 1]
+ node.right = Tree[i * 2 + 2]
+ return root
+
+
+
+# 算法:中序遍历二叉树
+
+class Solution:
+ def __init__(self):
+ self.T = []
+ def inorder(self, root: TreeNode) -> []:
+ if not root:
+ return
+ self.inorder(root.left)
+ self.T.append(root.val)
+ self.inorder(root.right)
+ return self.T
+
+
+
+# 验证创建二叉树的有效性,二叉排序树的中序遍历应为顺序排列
+
+test_tree = [3, 1, 5, -1, 2, 4 ,6]
+root = construct_binary_tree(test_tree)
+A = Solution()
+print(A.inorder(root))
```
From a0c16d48cb851b3c118cf3da0900797be767f9d0 Mon Sep 17 00:00:00 2001
From: Steve2020 <841532108@qq.com>
Date: Sat, 23 Apr 2022 18:19:36 +0800
Subject: [PATCH 10/40] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=EF=BC=880435.=E6=97=A0?=
=?UTF-8?q?=E9=87=8D=E5=8F=A0=E5=8C=BA=E9=97=B4.md=EF=BC=89=EF=BC=9A?=
=?UTF-8?q?=E5=A2=9E=E5=8A=A0typescript=E7=89=88=E6=9C=AC?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
problems/0435.无重叠区间.md | 51 +++++++++++++++++++++++++++++++-
1 file changed, 50 insertions(+), 1 deletion(-)
diff --git a/problems/0435.无重叠区间.md b/problems/0435.无重叠区间.md
index b24ca024..c7f755bf 100644
--- a/problems/0435.无重叠区间.md
+++ b/problems/0435.无重叠区间.md
@@ -263,7 +263,7 @@ func min(a,b int)int{
}
return a
}
-```
+```
### Javascript:
- 按右边界排序
@@ -306,6 +306,55 @@ var eraseOverlapIntervals = function(intervals) {
}
```
+### TypeScript
+
+> 按右边界排序,从左往右遍历
+
+```typescript
+function eraseOverlapIntervals(intervals: number[][]): number {
+ const length = intervals.length;
+ if (length === 0) return 0;
+ intervals.sort((a, b) => a[1] - b[1]);
+ let right: number = intervals[0][1];
+ let count: number = 1;
+ for (let i = 1; i < length; i++) {
+ if (intervals[i][0] >= right) {
+ count++;
+ right = intervals[i][1];
+ }
+ }
+ return length - count;
+};
+```
+
+> 按左边界排序,从左往右遍历
+
+```typescript
+function eraseOverlapIntervals(intervals: number[][]): number {
+ if (intervals.length === 0) return 0;
+ intervals.sort((a, b) => a[0] - b[0]);
+ let right: number = intervals[0][1];
+ let tempInterval: number[];
+ let resCount: number = 0;
+ for (let i = 1, length = intervals.length; i < length; i++) {
+ tempInterval = intervals[i];
+ if (tempInterval[0] >= right) {
+ // 未重叠
+ right = tempInterval[1];
+ } else {
+ // 有重叠,移除当前interval和前一个interval中右边界更大的那个
+ right = Math.min(right, tempInterval[1]);
+ resCount++;
+ }
+ }
+ return resCount;
+};
+```
+
+
+
+
+
-----------------------
From 7c752afaf472f8e3056d9bfefd9628548cbec5d8 Mon Sep 17 00:00:00 2001
From: h4 <20080114+tan-i-ham@users.noreply.github.com>
Date: Sat, 23 Apr 2022 22:19:09 +0900
Subject: [PATCH 11/40] chore: Sync 150 markdown render format
---
problems/0150.逆波兰表达式求值.md | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/problems/0150.逆波兰表达式求值.md b/problems/0150.逆波兰表达式求值.md
index f4dad823..fd3d69aa 100644
--- a/problems/0150.逆波兰表达式求值.md
+++ b/problems/0150.逆波兰表达式求值.md
@@ -109,7 +109,7 @@ public:
};
```
-# 题外话
+## 题外话
我们习惯看到的表达式都是中缀表达式,因为符合我们的习惯,但是中缀表达式对于计算机来说就不是很友好了。
@@ -128,7 +128,7 @@ public:
-# 其他语言版本
+## 其他语言版本
java:
From 531c1b0a3bfac9867a8403baaf95a6cd284f6a41 Mon Sep 17 00:00:00 2001
From: Steve2020 <841532108@qq.com>
Date: Sat, 23 Apr 2022 21:19:23 +0800
Subject: [PATCH 12/40] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=EF=BC=880763.=E5=88=92?=
=?UTF-8?q?=E5=88=86=E5=AD=97=E6=AF=8D=E5=8C=BA=E9=97=B4.md=EF=BC=89?=
=?UTF-8?q?=EF=BC=9A=E5=A2=9E=E5=8A=A0typescript=E7=89=88=E6=9C=AC?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
problems/0763.划分字母区间.md | 25 +++++++++++++++++++++++++
1 file changed, 25 insertions(+)
diff --git a/problems/0763.划分字母区间.md b/problems/0763.划分字母区间.md
index 03d3a73b..901dccb4 100644
--- a/problems/0763.划分字母区间.md
+++ b/problems/0763.划分字母区间.md
@@ -174,6 +174,31 @@ var partitionLabels = function(s) {
};
```
+### TypeScript
+
+```typescript
+function partitionLabels(s: string): number[] {
+ const length: number = s.length;
+ const resArr: number[] = [];
+ const helperMap: Map = new Map();
+ for (let i = 0; i < length; i++) {
+ helperMap.set(s[i], i);
+ }
+ let left: number = 0;
+ let right: number = 0;
+ for (let i = 0; i < length; i++) {
+ right = Math.max(helperMap.get(s[i])!, right);
+ if (i === right) {
+ resArr.push(i - left + 1);
+ left = i + 1;
+ }
+ }
+ return resArr;
+};
+```
+
+
+
-----------------------
From 8966752197c174e46052ab549495a045ce1a5f14 Mon Sep 17 00:00:00 2001
From: Steve2020 <841532108@qq.com>
Date: Sat, 23 Apr 2022 21:44:11 +0800
Subject: [PATCH 13/40] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=EF=BC=880056.=E5=90=88?=
=?UTF-8?q?=E5=B9=B6=E5=8C=BA=E9=97=B4.md=EF=BC=89=EF=BC=9A=E5=A2=9E?=
=?UTF-8?q?=E5=8A=A0typescript=E7=89=88=E6=9C=AC?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
problems/0056.合并区间.md | 20 ++++++++++++++++++++
1 file changed, 20 insertions(+)
diff --git a/problems/0056.合并区间.md b/problems/0056.合并区间.md
index a9caeaf0..b44d602c 100644
--- a/problems/0056.合并区间.md
+++ b/problems/0056.合并区间.md
@@ -266,6 +266,26 @@ var merge = function(intervals) {
};
```
+### TypeScript
+
+```typescript
+function merge(intervals: number[][]): number[][] {
+ const resArr: number[][] = [];
+ intervals.sort((a, b) => a[0] - b[0]);
+ resArr[0] = [...intervals[0]]; // 避免修改原intervals
+ for (let i = 1, length = intervals.length; i < length; i++) {
+ let interval: number[] = intervals[i];
+ let last: number[] = resArr[resArr.length - 1];
+ if (interval[0] <= last[1]) {
+ last[1] = Math.max(interval[1], last[1]);
+ } else {
+ resArr.push([...intervals[i]]);
+ }
+ }
+ return resArr;
+};
+```
+
-----------------------
From e2807eb59ad5b9e45311544278c905fd942e85b3 Mon Sep 17 00:00:00 2001
From: 243wresfdxvc
Date: Sat, 23 Apr 2022 16:15:53 +0000
Subject: [PATCH 14/40] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=200203.=E7=A7=BB?=
=?UTF-8?q?=E5=87=BA=E9=93=BE=E8=A1=A8=E5=85=83=E7=B4=A0.md=20C=E8=AF=AD?=
=?UTF-8?q?=E8=A8=80=E8=A7=A3=E6=B3=95?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
problems/0203.移除链表元素.md | 32 +++++++++++++++++++++++++++++
1 file changed, 32 insertions(+)
diff --git a/problems/0203.移除链表元素.md b/problems/0203.移除链表元素.md
index c34831b7..751553e2 100644
--- a/problems/0203.移除链表元素.md
+++ b/problems/0203.移除链表元素.md
@@ -145,6 +145,38 @@ public:
## 其他语言版本
C:
+用原来的链表操作:
+```c
+struct ListNode* removeElements(struct ListNode* head, int val){
+ struct ListNode* temp;
+ // 当头结点存在并且头结点的值等于val时
+ while(head && head->val == val) {
+ temp = head;
+ // 将新的头结点设置为head->next并删除原来的头结点
+ head = head->next;
+ free(temp);
+ }
+
+ struct ListNode *cur = head;
+ // 当cur存在并且cur->next存在时
+ // 此解法需要判断cur存在因为cur指向head。若head本身为NULL或者原链表中元素都为val的话,cur也会为NULL
+ while(cur && (temp = cur->next)) {
+ // 若cur->next的值等于val
+ if(temp->val == val) {
+ // 将cur->next设置为cur->next->next并删除cur->next
+ cur->next = temp->next;
+ free(temp);
+ }
+ // 若cur->next不等于val,则将cur后移一位
+ else
+ cur = cur->next;
+ }
+
+ // 返回头结点
+ return head;
+}
+```
+设置一个虚拟头结点:
```c
/**
* Definition for singly-linked list.
From 7cf68bd1f2eaa6ad83d69b969f29b1b146397dfa Mon Sep 17 00:00:00 2001
From: Steve2020 <841532108@qq.com>
Date: Sun, 24 Apr 2022 17:40:23 +0800
Subject: [PATCH 15/40] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=EF=BC=880738.=E5=8D=95?=
=?UTF-8?q?=E8=B0=83=E9=80=92=E5=A2=9E=E7=9A=84=E6=95=B0=E5=AD=97.md?=
=?UTF-8?q?=EF=BC=89=EF=BC=9A=E5=A2=9E=E5=8A=A0typescript=E7=89=88?=
=?UTF-8?q?=E6=9C=AC?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
problems/0738.单调递增的数字.md | 22 ++++++++++++++++++++++
1 file changed, 22 insertions(+)
diff --git a/problems/0738.单调递增的数字.md b/problems/0738.单调递增的数字.md
index c8ce8a2b..4e4079a7 100644
--- a/problems/0738.单调递增的数字.md
+++ b/problems/0738.单调递增的数字.md
@@ -225,6 +225,28 @@ var monotoneIncreasingDigits = function(n) {
};
```
+### TypeScript
+
+```typescript
+function monotoneIncreasingDigits(n: number): number {
+ let strArr: number[] = String(n).split('').map(i => parseInt(i));
+ const length = strArr.length;
+ let flag: number = length;
+ for (let i = length - 2; i >= 0; i--) {
+ if (strArr[i] > strArr[i + 1]) {
+ strArr[i] -= 1;
+ flag = i + 1;
+ }
+ }
+ for (let i = flag; i < length; i++) {
+ strArr[i] = 9;
+ }
+ return parseInt(strArr.join(''));
+};
+```
+
+
+
-----------------------
From d5f21d534198069fee0dd4a90397d1322d435179 Mon Sep 17 00:00:00 2001
From: eat to 160 pounds <2915390277@qq.com>
Date: Sun, 24 Apr 2022 21:05:31 +0800
Subject: [PATCH 16/40] =?UTF-8?q?=E6=9B=B4=E6=96=B0=E4=BA=86=E4=B8=89?=
=?UTF-8?q?=E6=95=B0=E4=B9=8B=E5=92=8Cjavascript=E7=89=88=E6=9C=AC?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
problems/0015.三数之和.md | 70 +++++++++++++----------------------
1 file changed, 26 insertions(+), 44 deletions(-)
diff --git a/problems/0015.三数之和.md b/problems/0015.三数之和.md
index bfde6b35..cc184c87 100644
--- a/problems/0015.三数之和.md
+++ b/problems/0015.三数之和.md
@@ -313,54 +313,36 @@ func threeSum(nums []int)[][]int{
javaScript:
```js
-/**
- * @param {number[]} nums
- * @return {number[][]}
- */
-
-// 循环内不考虑去重
var threeSum = function(nums) {
- const len = nums.length;
- if(len < 3) return [];
- nums.sort((a, b) => a - b);
- const resSet = new Set();
- for(let i = 0; i < len - 2; i++) {
- if(nums[i] > 0) break;
- let l = i + 1, r = len - 1;
+ const res = [], len = nums.length
+ // 将数组排序
+ nums.sort((a, b) => a - b)
+ for (let i = 0; i < len; i++) {
+ let l = i + 1, r = len - 1, iNum = nums[i]
+ // 数组排过序,如果第一个数大于0直接返回res
+ if (iNum > 0) return res
+ // 去重
+ if (iNum == nums[i - 1]) continue
while(l < r) {
- const sum = nums[i] + nums[l] + nums[r];
- if(sum < 0) { l++; continue };
- if(sum > 0) { r--; continue };
- resSet.add(`${nums[i]},${nums[l]},${nums[r]}`);
- l++;
- r--;
+ let lNum = nums[l], rNum = nums[r], threeSum = iNum + lNum + rNum
+ // 三数之和小于0,则左指针向右移动
+ if (threeSum < 0) l++
+ else if (threeSum > 0) r--
+ else {
+ res.push([iNum, lNum, rNum])
+ // 去重
+ while(l < r && nums[l] == nums[l + 1]){
+ l++
+ }
+ while(l < r && nums[r] == nums[r - 1]) {
+ r--
+ }
+ l++
+ r--
+ }
}
}
- return Array.from(resSet).map(i => i.split(","));
-};
-
-// 去重优化
-var threeSum = function(nums) {
- const len = nums.length;
- if(len < 3) return [];
- nums.sort((a, b) => a - b);
- const res = [];
- for(let i = 0; i < len - 2; i++) {
- if(nums[i] > 0) break;
- // a去重
- if(i > 0 && nums[i] === nums[i - 1]) continue;
- let l = i + 1, r = len - 1;
- while(l < r) {
- const sum = nums[i] + nums[l] + nums[r];
- if(sum < 0) { l++; continue };
- if(sum > 0) { r--; continue };
- res.push([nums[i], nums[l], nums[r]])
- // b c 去重
- while(l < r && nums[l] === nums[++l]);
- while(l < r && nums[r] === nums[--r]);
- }
- }
- return res;
+ return res
};
```
TypeScript:
From 84750aca45f96f15e4dc271410c32cde78667e41 Mon Sep 17 00:00:00 2001
From: 243wresfdxvc
Date: Sun, 24 Apr 2022 18:32:09 +0000
Subject: [PATCH 17/40] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=200860.=E6=9F=A0?=
=?UTF-8?q?=E6=AA=AC=E6=B0=B4=E6=89=BE=E9=9B=B6.md=20C=E8=AF=AD=E8=A8=80?=
=?UTF-8?q?=E7=89=88=E6=9C=AC?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
problems/0860.柠檬水找零.md | 43 ++++++++++++++++++++++++++++++++
1 file changed, 43 insertions(+)
diff --git a/problems/0860.柠檬水找零.md b/problems/0860.柠檬水找零.md
index ffd5490d..2738f574 100644
--- a/problems/0860.柠檬水找零.md
+++ b/problems/0860.柠檬水找零.md
@@ -250,6 +250,49 @@ var lemonadeChange = function(bills) {
return true
};
+```
+### C
+```c
+bool lemonadeChange(int* bills, int billsSize){
+ // 分别记录五元、十元的数量(二十元不用记录,因为不会用到20元找零)
+ int fiveCount = 0; int tenCount = 0;
+
+ int i;
+ for(i = 0; i < billsSize; ++i) {
+ // 分情况讨论每位顾客的付款
+ switch(bills[i]) {
+ // 情况一:直接收款五元
+ case 5:
+ fiveCount++;
+ break;
+ // 情况二:收款十元
+ case 10:
+ // 若没有五元找零,返回false
+ if(fiveCount == 0)
+ return false;
+ // 收款十元并找零五元
+ fiveCount--;
+ tenCount++;
+ break;
+ // 情况三:收款二十元
+ case 20:
+ // 若可以,优先用十元和五元找零(因为十元只能找零20,所以需要尽量用掉。而5元能找零十元和二十元)
+ if(fiveCount > 0 && tenCount > 0) {
+ fiveCount--;
+ tenCount--;
+ }
+ // 若没有十元,但是有三张五元。用三张五元找零
+ else if(fiveCount >= 3)
+ fiveCount-=3;
+ // 无法找开,返回false
+ else
+ return false;
+ break;
+ }
+ }
+ // 全部可以找开,返回true
+ return true;
+}
```
-----------------------
From 8291e5e1c6d1b9c913a35015848124ad9cfd1808 Mon Sep 17 00:00:00 2001
From: Steve2020 <841532108@qq.com>
Date: Mon, 25 Apr 2022 14:05:53 +0800
Subject: [PATCH 18/40] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=EF=BC=880714.=E4=B9=B0?=
=?UTF-8?q?=E5=8D=96=E8=82=A1=E7=A5=A8=E7=9A=84=E6=9C=80=E4=BD=B3=E6=97=B6?=
=?UTF-8?q?=E6=9C=BA=E5=90=AB=E6=89=8B=E7=BB=AD=E8=B4=B9.md=EF=BC=89?=
=?UTF-8?q?=EF=BC=9A=E5=A2=9E=E5=8A=A0typescript=E7=89=88=E6=9C=AC?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
...买卖股票的最佳时机含手续费.md | 44 +++++++++++++++++++
1 file changed, 44 insertions(+)
diff --git a/problems/0714.买卖股票的最佳时机含手续费.md b/problems/0714.买卖股票的最佳时机含手续费.md
index 2f27d6ea..b27631c6 100644
--- a/problems/0714.买卖股票的最佳时机含手续费.md
+++ b/problems/0714.买卖股票的最佳时机含手续费.md
@@ -293,6 +293,50 @@ var maxProfit = function(prices, fee) {
};
```
+TypeScript:
+
+> 贪心
+
+```typescript
+function maxProfit(prices: number[], fee: number): number {
+ if (prices.length === 0) return 0;
+ let minPrice: number = prices[0];
+ let profit: number = 0;
+ for (let i = 1, length = prices.length; i < length; i++) {
+ if (minPrice > prices[i]) {
+ minPrice = prices[i];
+ }
+ if (minPrice + fee < prices[i]) {
+ profit += prices[i] - minPrice - fee;
+ minPrice = prices[i] - fee;
+ }
+ }
+ return profit;
+};
+```
+
+> 动态规划
+
+```typescript
+function maxProfit(prices: number[], fee: number): number {
+ /**
+ dp[i][1]: 第i天不持有股票的最大所剩现金
+ dp[i][0]: 第i天持有股票的最大所剩现金
+ */
+ const length: number = prices.length;
+ const dp: number[][] = new Array(length).fill(0).map(_ => []);
+ dp[0][1] = 0;
+ dp[0][0] = -prices[0];
+ for (let i = 1, length = prices.length; i < length; i++) {
+ dp[i][1] = Math.max(dp[i - 1][1], dp[i - 1][0] + prices[i] - fee);
+ dp[i][0] = Math.max(dp[i - 1][0], dp[i - 1][1] - prices[i]);
+ }
+ return Math.max(dp[length - 1][0], dp[length - 1][1]);
+};
+```
+
+
+
-----------------------
From 7b45a3209014190bbee02de8df566638701db734 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=E5=BC=A0=E4=BD=B3=E4=B9=90?= <1791781644@qq.com>
Date: Mon, 25 Apr 2022 22:10:18 +0800
Subject: [PATCH 19/40] =?UTF-8?q?=E4=BF=AE=E6=94=B9=20=E7=BB=99=E4=BA=8C?=
=?UTF-8?q?=E5=8F=89=E6=A0=91=E9=81=8D=E5=8E=86=E9=A2=98=E7=9B=AE=E5=8A=A0?=
=?UTF-8?q?=E4=B8=8A=E5=8A=9B=E6=89=A3=E9=93=BE=E6=8E=A5?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
problems/二叉树的迭代遍历.md | 6 +++---
problems/二叉树的递归遍历.md | 6 +++---
2 files changed, 6 insertions(+), 6 deletions(-)
diff --git a/problems/二叉树的迭代遍历.md b/problems/二叉树的迭代遍历.md
index 8164724b..13ba5f1e 100644
--- a/problems/二叉树的迭代遍历.md
+++ b/problems/二叉树的迭代遍历.md
@@ -11,9 +11,9 @@
看完本篇大家可以使用迭代法,再重新解决如下三道leetcode上的题目:
-* 144.二叉树的前序遍历
-* 94.二叉树的中序遍历
-* 145.二叉树的后序遍历
+* [144.二叉树的前序遍历](https://leetcode-cn.com/problems/binary-tree-preorder-traversal/)
+* [94.二叉树的中序遍历](https://leetcode-cn.com/problems/binary-tree-inorder-traversal/)
+* [145.二叉树的后序遍历](https://leetcode-cn.com/problems/binary-tree-postorder-traversal/)
为什么可以用迭代法(非递归的方式)来实现二叉树的前后中序遍历呢?
diff --git a/problems/二叉树的递归遍历.md b/problems/二叉树的递归遍历.md
index 35d19d7b..13e704ea 100644
--- a/problems/二叉树的递归遍历.md
+++ b/problems/二叉树的递归遍历.md
@@ -99,9 +99,9 @@ void traversal(TreeNode* cur, vector& vec) {
此时大家可以做一做leetcode上三道题目,分别是:
-* 144.二叉树的前序遍历
-* 145.二叉树的后序遍历
-* 94.二叉树的中序遍历
+* [144.二叉树的前序遍历](https://leetcode-cn.com/problems/binary-tree-preorder-traversal/)
+* [145.二叉树的后序遍历](https://leetcode-cn.com/problems/binary-tree-postorder-traversal/)
+* [94.二叉树的中序遍历](https://leetcode-cn.com/problems/binary-tree-inorder-traversal/)
可能有同学感觉前后中序遍历的递归太简单了,要打迭代法(非递归),别急,我们明天打迭代法,打个通透!
From 9da09584cd39f56c937b5c68b7375ab0d602957b Mon Sep 17 00:00:00 2001
From: Steve2020 <841532108@qq.com>
Date: Tue, 26 Apr 2022 00:03:54 +0800
Subject: [PATCH 20/40] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=EF=BC=880968.=E7=9B=91?=
=?UTF-8?q?=E6=8E=A7=E4=BA=8C=E5=8F=89=E6=A0=91.md=EF=BC=89=EF=BC=9A?=
=?UTF-8?q?=E5=A2=9E=E5=8A=A0typescript=E7=89=88=E6=9C=AC?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
problems/0968.监控二叉树.md | 28 ++++++++++++++++++++++++++++
1 file changed, 28 insertions(+)
diff --git a/problems/0968.监控二叉树.md b/problems/0968.监控二叉树.md
index 35c3ccdc..9a510a1b 100644
--- a/problems/0968.监控二叉树.md
+++ b/problems/0968.监控二叉树.md
@@ -476,7 +476,35 @@ var minCameraCover = function(root) {
};
```
+### TypeScript
+
+```typescript
+function minCameraCover(root: TreeNode | null): number {
+ /** 0-无覆盖, 1-有摄像头, 2-有覆盖 */
+ type statusCode = 0 | 1 | 2;
+ let resCount: number = 0;
+ if (recur(root) === 0) resCount++;
+ return resCount;
+ function recur(node: TreeNode | null): statusCode {
+ if (node === null) return 2;
+ const left: statusCode = recur(node.left),
+ right: statusCode = recur(node.right);
+ let resStatus: statusCode = 0;
+ if (left === 0 || right === 0) {
+ resStatus = 1;
+ resCount++;
+ } else if (left === 1 || right === 1) {
+ resStatus = 2;
+ } else {
+ resStatus = 0;
+ }
+ return resStatus;
+ }
+};
+```
+
### C
+
```c
/*
**函数后序遍历二叉树。判断一个结点状态时,根据其左右孩子结点的状态进行判断
From 3ec08f41dd08cdd830215bdf2b602bbdcfc92512 Mon Sep 17 00:00:00 2001
From: 243wresfdxvc
Date: Mon, 25 Apr 2022 18:18:50 +0000
Subject: [PATCH 21/40] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=200406.=E6=A0=B9?=
=?UTF-8?q?=E6=8D=AE=E8=BA=AB=E9=AB=98=E9=87=8D=E5=BB=BA=E9=98=9F=E5=88=97?=
=?UTF-8?q?.md=20C=E8=AF=AD=E8=A8=80=E7=89=88=E6=9C=AC?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
problems/0406.根据身高重建队列.md | 47 +++++++++++++++++++++++
1 file changed, 47 insertions(+)
diff --git a/problems/0406.根据身高重建队列.md b/problems/0406.根据身高重建队列.md
index b2354d09..9cefa11c 100644
--- a/problems/0406.根据身高重建队列.md
+++ b/problems/0406.根据身高重建队列.md
@@ -290,6 +290,53 @@ var reconstructQueue = function(people) {
};
```
+### C
+```c
+int cmp(const void *p1, const void *p2) {
+ int *pp1 = *(int**)p1;
+ int *pp2 = *(int**)p2;
+ // 若身高相同,则按照k从小到大排列
+ // 若身高不同,按身高从大到小排列
+ return pp1[0] == pp2[0] ? pp1[1] - pp2[1] : pp2[0] - pp1[0];
+}
+
+// 将start与end中间的元素都后移一位
+// start为将要新插入元素的位置
+void moveBack(int **people, int peopleSize, int start, int end) {
+ int i;
+ for(i = end; i > start; i--) {
+ people[i] = people[i-1];
+ }
+}
+
+int** reconstructQueue(int** people, int peopleSize, int* peopleColSize, int* returnSize, int** returnColumnSizes){
+ int i;
+ // 将people按身高从大到小排列(若身高相同,按k从小到大排列)
+ qsort(people, peopleSize, sizeof(int*), cmp);
+
+ for(i = 0; i < peopleSize; ++i) {
+ // people[i]要插入的位置
+ int position = people[i][1];
+ int *temp = people[i];
+ // 将position到i中间的元素后移一位
+ // 注:因为已经排好序,position不会比i大。(举例:排序后people最后一位元素最小,其可能的k最大值为peopleSize-2,小于此时的i)
+ moveBack(people, peopleSize, position, i);
+ // 将temp放置到position处
+ people[position] = temp;
+
+ }
+
+
+ // 设置返回二维数组的大小以及里面每个一维数组的长度
+ *returnSize = peopleSize;
+ *returnColumnSizes = (int*)malloc(sizeof(int) * peopleSize);
+ for(i = 0; i < peopleSize; ++i) {
+ (*returnColumnSizes)[i] = 2;
+ }
+ return people;
+}
+```
+
-----------------------
From c7e34a3f9b82d989b408b4303aee17bd192fb91f Mon Sep 17 00:00:00 2001
From: JackZJ <56966563+laerpeeK@users.noreply.github.com>
Date: Thu, 28 Apr 2022 08:28:12 +0800
Subject: [PATCH 22/40] =?UTF-8?q?Update=20=E8=83=8C=E5=8C=85=E7=90=86?=
=?UTF-8?q?=E8=AE=BA=E5=9F=BA=E7=A1=8001=E8=83=8C=E5=8C=85JavaScript?=
=?UTF-8?q?=E4=BB=A3=E7=A0=81=E5=9D=97?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
更新JavaScript版本二维数组做法,目前文档上的是运行不了的。
---
problems/背包理论基础01背包-1.md | 53 ++++++++++++++----------
1 file changed, 31 insertions(+), 22 deletions(-)
diff --git a/problems/背包理论基础01背包-1.md b/problems/背包理论基础01背包-1.md
index fe940b4c..a844dcf5 100644
--- a/problems/背包理论基础01背包-1.md
+++ b/problems/背包理论基础01背包-1.md
@@ -380,31 +380,40 @@ func main() {
### javascript
```js
-function testweightbagproblem (wight, value, size) {
- const len = wight.length,
- dp = array.from({length: len + 1}).map(
- () => array(size + 1).fill(0)
- );
-
- for(let i = 1; i <= len; i++) {
- for(let j = 0; j <= size; j++) {
- if(wight[i - 1] <= j) {
- dp[i][j] = math.max(
- dp[i - 1][j],
- value[i - 1] + dp[i - 1][j - wight[i - 1]]
- )
- } else {
- dp[i][j] = dp[i - 1][j];
- }
- }
- }
+/**
+ *
+ * @param {Number []} weight
+ * @param {Number []} value
+ * @param {Number} size
+ * @returns
+ */
-// console.table(dp);
-
- return dp[len][size];
+function testWeightBagProblem(weight, value, size) {
+const len = weight.length,
+dp = Array.from({length: len}).map(
+() => Array(size + 1)) //JavaScript 数组是引用类型
+for(let i = 0; i < len; i++) { //初始化最左一列,即背包容量为0时的情况
+dp[i][0] = 0;
+}
+for(let j = 1; j < size+1; j++) { //初始化第0行, 只有一件物品的情况
+if(weight[0] <= j) {
+dp[0][j] = value[0];
+} else {
+dp[0][j] = 0;
+}
+}
+
+for(let i = 1; i < len; i++) { //dp[i][j]由其左上方元素推导得出
+for(let j = 1; j < size+1; j++) {
+if(j < weight[i]) dp[i][j] = dp[i - 1][j];
+else dp[i][j] = Math.max(dp[i-1][j], dp[i-1][j - weight[i]] + value[i]);
+}
}
-function testWeightBagProblem2 (wight, value, size) {
+return dp[len-1][size] //满足条件的最大值
+}
+
+function testWeightBagProblem2 (wight, value, size)4 {
const len = wight.length,
dp = Array(size + 1).fill(0);
for(let i = 1; i <= len; i++) {
From 0694fac15bf6b7d18a53adc9f6ad0c33b51db016 Mon Sep 17 00:00:00 2001
From: JackZJ <56966563+laerpeeK@users.noreply.github.com>
Date: Thu, 28 Apr 2022 08:30:30 +0800
Subject: [PATCH 23/40] =?UTF-8?q?Update=20=E8=83=8C=E5=8C=85=E7=90=86?=
=?UTF-8?q?=E8=AE=BA=E5=9F=BA=E7=A1=8001=E8=83=8C=E5=8C=85JavaScript?=
=?UTF-8?q?=E4=BB=A3=E7=A0=81=E5=9D=97?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
更新背包理论基础01背包JavaScript代码块 - 二维数组做法1, 目前主线上的是有问题的。
---
problems/背包理论基础01背包-1.md | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/problems/背包理论基础01背包-1.md b/problems/背包理论基础01背包-1.md
index a844dcf5..d6bc5520 100644
--- a/problems/背包理论基础01背包-1.md
+++ b/problems/背包理论基础01背包-1.md
@@ -413,7 +413,7 @@ else dp[i][j] = Math.max(dp[i-1][j], dp[i-1][j - weight[i]] + value[i]);
return dp[len-1][size] //满足条件的最大值
}
-function testWeightBagProblem2 (wight, value, size)4 {
+function testWeightBagProblem2 (wight, value, size) {
const len = wight.length,
dp = Array(size + 1).fill(0);
for(let i = 1; i <= len; i++) {
From 5fd43cfd0a5770e0cb532687766f64306b5bbfed Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=E8=91=A3xx?=
Date: Thu, 28 Apr 2022 22:20:22 +0800
Subject: [PATCH 24/40] =?UTF-8?q?0300.=E6=9C=80=E9=95=BF=E4=B8=8A=E5=8D=87?=
=?UTF-8?q?=E5=AD=90=E5=BA=8F=E5=88=97-go=E5=8A=A8=E6=80=81=E8=A7=84?=
=?UTF-8?q?=E5=88=92=E6=B1=82=E8=A7=A3?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
problems/0300.最长上升子序列.md | 33 ++++++++++++++++++++++++++
1 file changed, 33 insertions(+)
diff --git a/problems/0300.最长上升子序列.md b/problems/0300.最长上升子序列.md
index dfdd5125..f68edb5a 100644
--- a/problems/0300.最长上升子序列.md
+++ b/problems/0300.最长上升子序列.md
@@ -168,6 +168,39 @@ func lengthOfLIS(nums []int ) int {
}
```
+```go
+// 动态规划求解
+func lengthOfLIS(nums []int) int {
+ // dp数组的定义 dp[i]表示取第i个元素的时候,表示子序列的长度,其中包括 nums[i] 这个元素
+ dp := make([]int, len(nums))
+
+ // 初始化,所有的元素都应该初始化为1
+ for i := range dp {
+ dp[i] = 1
+ }
+
+ ans := dp[0]
+ for i := 1; i < len(nums); i++ {
+ for j := 0; j < i; j++ {
+ if nums[i] > nums[j] {
+ dp[i] = max(dp[i], dp[j] + 1)
+ }
+ }
+ if dp[i] > ans {
+ ans = dp[i]
+ }
+ }
+ return ans
+}
+
+func max(x, y int) int {
+ if x > y {
+ return x
+ }
+ return y
+}
+```
+
Javascript
```javascript
const lengthOfLIS = (nums) => {
From 6f85c2ad3a6daf8e0098b08e61b7fdd68d78c757 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=E8=91=A3xx?=
Date: Fri, 29 Apr 2022 00:50:22 +0800
Subject: [PATCH 25/40] =?UTF-8?q?0674.=E6=9C=80=E9=95=BF=E8=BF=9E=E7=BB=AD?=
=?UTF-8?q?=E9=80=92=E5=A2=9E=E5=BA=8F=E5=88=97-go=E5=8A=A8=E6=80=81?=
=?UTF-8?q?=E8=A7=84=E5=88=92=E6=B1=82=E8=A7=A3?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
problems/0674.最长连续递增序列.md | 39 +++++++++++++++++++++++
1 file changed, 39 insertions(+)
diff --git a/problems/0674.最长连续递增序列.md b/problems/0674.最长连续递增序列.md
index e941d242..56e95d97 100644
--- a/problems/0674.最长连续递增序列.md
+++ b/problems/0674.最长连续递增序列.md
@@ -236,6 +236,45 @@ class Solution:
```
Go:
+> 动态规划:
+```go
+func findLengthOfLCIS(nums []int) int {
+ if len(nums) == 0 {return 0}
+ res, count := 1, 1
+ for i := 0; i < len(nums)-1; i++ {
+ if nums[i+1] > nums[i] {
+ count++
+ }else {
+ count = 1
+ }
+ if count > res {
+ res = count
+ }
+ }
+ return res
+}
+```
+
+> 贪心算法:
+```go
+func findLengthOfLCIS(nums []int) int {
+ if len(nums) == 0 {return 0}
+ dp := make([]int, len(nums))
+ for i := 0; i < len(dp); i++ {
+ dp[i] = 1
+ }
+ res := 1
+ for i := 0; i < len(nums)-1; i++ {
+ if nums[i+1] > nums[i] {
+ dp[i+1] = dp[i] + 1
+ }
+ if dp[i+1] > res {
+ res = dp[i+1]
+ }
+ }
+ return res
+}
+```
Javascript:
From 31eb619ea18d05e004da853d70b165ba47291c92 Mon Sep 17 00:00:00 2001
From: Anmizi <1845513904@qq.com>
Date: Fri, 29 Apr 2022 19:15:41 +0800
Subject: [PATCH 26/40] =?UTF-8?q?=E4=BC=98=E5=8C=96JS=E7=89=88=E6=9C=AC?=
=?UTF-8?q?=E4=BB=A3=E7=A0=81=20(0039.=E7=BB=84=E5=90=88=E6=80=BB=E5=92=8C?=
=?UTF-8?q?.md)?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
problems/0039.组合总和.md | 5 ++---
1 file changed, 2 insertions(+), 3 deletions(-)
diff --git a/problems/0039.组合总和.md b/problems/0039.组合总和.md
index 98b37b84..e10a827f 100644
--- a/problems/0039.组合总和.md
+++ b/problems/0039.组合总和.md
@@ -370,18 +370,17 @@ func backtracking(startIndex,sum,target int,candidates,trcak []int,res *[][]int)
```js
var combinationSum = function(candidates, target) {
const res = [], path = [];
- candidates.sort(); // 排序
+ candidates.sort((a,b)=>a-b); // 排序
backtracking(0, 0);
return res;
function backtracking(j, sum) {
- if (sum > target) return;
if (sum === target) {
res.push(Array.from(path));
return;
}
for(let i = j; i < candidates.length; i++ ) {
const n = candidates[i];
- if(n > target - sum) continue;
+ if(n > target - sum) break;
path.push(n);
sum += n;
backtracking(i, sum);
From 5b3607c6a151b6fd6dd548c1b26f3f1fb8514047 Mon Sep 17 00:00:00 2001
From: Anmizi <1845513904@qq.com>
Date: Fri, 29 Apr 2022 23:18:33 +0800
Subject: [PATCH 27/40] =?UTF-8?q?=E4=BF=AE=E6=94=B9=200040.=E7=BB=84?=
=?UTF-8?q?=E5=90=88=E6=80=BB=E5=92=8CII.md?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
problems/0040.组合总和II.md | 15 ++++++++++-----
1 file changed, 10 insertions(+), 5 deletions(-)
diff --git a/problems/0040.组合总和II.md b/problems/0040.组合总和II.md
index de13e031..34ac64e6 100644
--- a/problems/0040.组合总和II.md
+++ b/problems/0040.组合总和II.md
@@ -508,22 +508,27 @@ func backtracking(startIndex,sum,target int,candidates,trcak []int,res *[][]int)
*/
var combinationSum2 = function(candidates, target) {
const res = []; path = [], len = candidates.length;
- candidates.sort();
+ candidates.sort((a,b)=>a-b);
backtracking(0, 0);
return res;
function backtracking(sum, i) {
- if (sum > target) return;
if (sum === target) {
res.push(Array.from(path));
return;
}
- let f = -1;
for(let j = i; j < len; j++) {
const n = candidates[j];
- if(n > target - sum || n === f) continue;
+ if(j > i && candidates[j] === candidates[j-1]){
+ //若当前元素和前一个元素相等
+ //则本次循环结束,防止出现重复组合
+ continue;
+ }
+ //如果当前元素值大于目标值-总和的值
+ //由于数组已排序,那么该元素之后的元素必定不满足条件
+ //直接终止当前层的递归
+ if(n > target - sum) break;
path.push(n);
sum += n;
- f = n;
backtracking(sum, j + 1);
path.pop();
sum -= n;
From 55c78be1280054615f23c9e5859d139a7f840705 Mon Sep 17 00:00:00 2001
From: dmzlingyin
Date: Fri, 29 Apr 2022 23:38:34 +0800
Subject: [PATCH 28/40] =?UTF-8?q?update=20(0739.=E6=AF=8F=E6=97=A5?=
=?UTF-8?q?=E6=B8=A9=E5=BA=A6.md):=20python=E4=BB=A3=E7=A0=81=E9=AB=98?=
=?UTF-8?q?=E4=BA=AE?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
problems/0739.每日温度.md | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/problems/0739.每日温度.md b/problems/0739.每日温度.md
index 710f5eb6..7deab0a3 100644
--- a/problems/0739.每日温度.md
+++ b/problems/0739.每日温度.md
@@ -233,7 +233,7 @@ class Solution {
}
```
Python:
-``` Python3
+```python
class Solution:
def dailyTemperatures(self, temperatures: List[int]) -> List[int]:
answer = [0]*len(temperatures)
From d0a79760b65a1078284b036be6dcf8fa8eec5076 Mon Sep 17 00:00:00 2001
From: dmzlingyin
Date: Fri, 29 Apr 2022 23:41:26 +0800
Subject: [PATCH 29/40] =?UTF-8?q?update=20(0739.=E6=AF=8F=E6=97=A5?=
=?UTF-8?q?=E6=B8=A9=E5=BA=A6.md):=20=E8=AF=AD=E8=A8=80=E8=A1=A8=E8=BF=B0?=
=?UTF-8?q?=E4=BF=AE=E5=A4=8D?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
problems/0739.每日温度.md | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/problems/0739.每日温度.md b/problems/0739.每日温度.md
index 7deab0a3..f0f782d2 100644
--- a/problems/0739.每日温度.md
+++ b/problems/0739.每日温度.md
@@ -34,7 +34,7 @@
那么单调栈的原理是什么呢?为什么时间复杂度是O(n)就可以找到每一个元素的右边第一个比它大的元素位置呢?
-单调栈的本质是空间换时间,因为在遍历的过程中需要用一个栈来记录右边第一个比当前元素的元素,优点是只需要遍历一次。
+单调栈的本质是空间换时间,因为在遍历的过程中需要用一个栈来记录右边第一个比当前元素大的元素,优点是只需要遍历一次。
在使用单调栈的时候首先要明确如下几点:
From 636550d44c4ac65521865cca00b1c3c8b9f7c756 Mon Sep 17 00:00:00 2001
From: dmzlingyin
Date: Fri, 29 Apr 2022 23:50:31 +0800
Subject: [PATCH 30/40] =?UTF-8?q?update=20(0739.=E6=AF=8F=E6=97=A5?=
=?UTF-8?q?=E6=B8=A9=E5=BA=A6.md):=20=E5=A2=9E=E5=8A=A0=E6=9C=AA=E7=B2=BE?=
=?UTF-8?q?=E7=AE=80=E7=89=88=E6=9C=ACGo=E4=BB=A3=E7=A0=81?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
problems/0739.每日温度.md | 30 +++++++++++++++++++++++++++++-
1 file changed, 29 insertions(+), 1 deletion(-)
diff --git a/problems/0739.每日温度.md b/problems/0739.每日温度.md
index f0f782d2..206bebd2 100644
--- a/problems/0739.每日温度.md
+++ b/problems/0739.每日温度.md
@@ -277,8 +277,36 @@ func dailyTemperatures(t []int) []int {
}
```
-> 单调栈法
+> 单调栈法(未精简版本)
+```go
+func dailyTemperatures(temperatures []int) []int {
+ res := make([]int, len(temperatures))
+ // 初始化栈顶元素为第一个下标索引0
+ stack := []int{0}
+
+ for i := 1; i < len(temperatures); i++ {
+ top := stack[len(stack)-1]
+ if temperatures[i] < temperatures[top] {
+ stack = append(stack, i)
+ } else if temperatures[i] == temperatures[top] {
+ stack = append(stack, i)
+ } else {
+ for len(stack) != 0 && temperatures[i] > temperatures[top] {
+ res[top] = i - top
+ stack = stack[:len(stack)-1]
+ if len(stack) != 0 {
+ top = stack[len(stack)-1]
+ }
+ }
+ stack = append(stack, i)
+ }
+ }
+ return res
+}
+```
+
+> 单调栈法(精简版本)
```go
// 单调递减栈
func dailyTemperatures(num []int) []int {
From 49ec574821f687ea8703c61245f815bf2dc76139 Mon Sep 17 00:00:00 2001
From: dmzlingyin
Date: Sat, 30 Apr 2022 11:04:17 +0800
Subject: [PATCH 31/40] =?UTF-8?q?update=20(0496.=E4=B8=8B=E4=B8=80?=
=?UTF-8?q?=E4=B8=AA=E6=9B=B4=E5=A4=A7=E5=85=83=E7=B4=A0I):=20=E5=A2=9E?=
=?UTF-8?q?=E5=8A=A0=E6=9C=AA=E7=B2=BE=E7=AE=80Go=E7=89=88=E6=9C=AC?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
problems/0496.下一个更大元素I.md | 33 +++++++++++++++++++++++++
1 file changed, 33 insertions(+)
diff --git a/problems/0496.下一个更大元素I.md b/problems/0496.下一个更大元素I.md
index f9dfa308..02339677 100644
--- a/problems/0496.下一个更大元素I.md
+++ b/problems/0496.下一个更大元素I.md
@@ -244,6 +244,39 @@ class Solution:
```
Go:
+
+> 未精简版本
+```go
+func nextGreaterElement(nums1 []int, nums2 []int) []int {
+ res := make([]int, len(nums1))
+ for i := range res { res[i] = -1 }
+ m := make(map[int]int, len(nums1))
+ for k, v := range nums1 { m[v] = k }
+
+ stack := []int{0}
+ for i := 1; i < len(nums2); i++ {
+ top := stack[len(stack)-1]
+ if nums2[i] < nums2[top] {
+ stack = append(stack, i)
+ } else if nums2[i] == nums2[top] {
+ stack = append(stack, i)
+ } else {
+ for len(stack) != 0 && nums2[i] > nums2[top] {
+ if v, ok := m[nums2[top]]; ok {
+ res[v] = nums2[i]
+ }
+ stack = stack[:len(stack)-1]
+ if len(stack) != 0 {
+ top = stack[len(stack)-1]
+ }
+ }
+ stack = append(stack, i)
+ }
+ }
+ return res
+}
+```
+> 精简版本
```go
func nextGreaterElement(nums1 []int, nums2 []int) []int {
res := make([]int, len(nums1))
From 82e8b9eaac23041c2a358af126ec4e268ee383fa Mon Sep 17 00:00:00 2001
From: Steve2020 <841532108@qq.com>
Date: Sat, 30 Apr 2022 21:18:55 +0800
Subject: [PATCH 32/40] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=EF=BC=880509.=E6=96=90?=
=?UTF-8?q?=E6=B3=A2=E9=82=A3=E5=A5=91=E6=95=B0.md=EF=BC=89=EF=BC=9A?=
=?UTF-8?q?=E5=A2=9E=E5=8A=A0typescript=E7=89=88=E6=9C=AC?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
problems/0509.斐波那契数.md | 22 ++++++++++++++++++++++
1 file changed, 22 insertions(+)
diff --git a/problems/0509.斐波那契数.md b/problems/0509.斐波那契数.md
index d339940c..1d17784d 100644
--- a/problems/0509.斐波那契数.md
+++ b/problems/0509.斐波那契数.md
@@ -245,7 +245,29 @@ var fib = function(n) {
};
```
+TypeScript
+
+```typescript
+function fib(n: number): number {
+ /**
+ dp[i]: 第i个斐波那契数
+ dp[0]: 0;
+ dp[1]:1;
+ ...
+ dp[i] = dp[i - 1] + dp[i - 2];
+ */
+ const dp: number[] = [];
+ dp[0] = 0;
+ dp[1] = 1;
+ for (let i = 2; i <= n; i++) {
+ dp[i] = dp[i - 1] + dp[i - 2];
+ }
+ return dp[n];
+};
+```
+
### C
+
动态规划:
```c
int fib(int n){
From 0cba2d22f2d032bbf478662ef622d8022af24f21 Mon Sep 17 00:00:00 2001
From: Steve2020 <841532108@qq.com>
Date: Sat, 30 Apr 2022 21:53:14 +0800
Subject: [PATCH 33/40] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=EF=BC=880070.=E7=88=AC?=
=?UTF-8?q?=E6=A5=BC=E6=A2=AF.md=EF=BC=89=EF=BC=9A=E5=A2=9E=E5=8A=A0typesc?=
=?UTF-8?q?ript=E7=89=88=E6=9C=AC?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
problems/0070.爬楼梯.md | 51 ++++++++++++++++++++++++++++++++++++++
1 file changed, 51 insertions(+)
diff --git a/problems/0070.爬楼梯.md b/problems/0070.爬楼梯.md
index da19ea0e..34d41441 100644
--- a/problems/0070.爬楼梯.md
+++ b/problems/0070.爬楼梯.md
@@ -308,7 +308,58 @@ var climbStairs = function(n) {
};
```
+TypeScript
+
+> 爬2阶
+
+```typescript
+function climbStairs(n: number): number {
+ /**
+ dp[i]: i阶楼梯的方法种数
+ dp[1]: 1;
+ dp[2]: 2;
+ ...
+ dp[i]: dp[i - 1] + dp[i - 2];
+ */
+ const dp: number[] = [];
+ dp[1] = 1;
+ dp[2] = 2;
+ for (let i = 3; i <= n; i++) {
+ dp[i] = dp[i - 1] + dp[i - 2];
+ }
+ return dp[n];
+};
+```
+
+> 爬m阶
+
+```typescript
+function climbStairs(n: number): number {
+ /**
+ 一次可以爬m阶
+ dp[i]: i阶楼梯的方法种数
+ dp[1]: 1;
+ dp[2]: 2;
+ dp[3]: dp[2] + dp[1];
+ ...
+ dp[i]: dp[i - 1] + dp[i - 2] + ... + dp[max(i - m, 1)]; 从i-1加到max(i-m, 1)
+ */
+ const m: number = 2; // 本题m为2
+ const dp: number[] = new Array(n + 1).fill(0);
+ dp[1] = 1;
+ dp[2] = 2;
+ for (let i = 3; i <= n; i++) {
+ const end: number = Math.max(i - m, 1);
+ for (let j = i - 1; j >= end; j--) {
+ dp[i] += dp[j];
+ }
+ }
+ return dp[n];
+};
+```
+
### C
+
```c
int climbStairs(int n){
//若n<=2,返回n
From 1e81ef27100c8fc76bc38ec0135a4b18554398af Mon Sep 17 00:00:00 2001
From: Beim <73528776+162-jld@users.noreply.github.com>
Date: Sun, 1 May 2022 11:51:11 +0800
Subject: [PATCH 34/40] =?UTF-8?q?Update=200383.=E8=B5=8E=E9=87=91=E4=BF=A1?=
=?UTF-8?q?.md?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
problems/0383.赎金信.md | 28 +++++++++++++++-------------
1 file changed, 15 insertions(+), 13 deletions(-)
diff --git a/problems/0383.赎金信.md b/problems/0383.赎金信.md
index 00707347..56dcb8dd 100644
--- a/problems/0383.赎金信.md
+++ b/problems/0383.赎金信.md
@@ -110,23 +110,25 @@ Java:
```Java
class Solution {
public boolean canConstruct(String ransomNote, String magazine) {
- //记录杂志字符串出现的次数
- int[] arr = new int[26];
- int temp;
- for (int i = 0; i < magazine.length(); i++) {
- temp = magazine.charAt(i) - 'a';
- arr[temp]++;
+ // 定义一个哈希映射数组
+ int[] record = new int[26];
+
+ // 遍历
+ for(char c : magazine.toCharArray()){
+ record[c - 'a'] += 1;
}
- for (int i = 0; i < ransomNote.length(); i++) {
- temp = ransomNote.charAt(i) - 'a';
- //对于金信中的每一个字符都在数组中查找
- //找到相应位减一,否则找不到返回false
- if (arr[temp] > 0) {
- arr[temp]--;
- } else {
+
+ for(char c : ransomNote.toCharArray()){
+ record[c - 'a'] -= 1;
+ }
+
+ // 如果数组中存在负数,说明ransomNote字符串总存在magazine中没有的字符
+ for(int i : record){
+ if(i < 0){
return false;
}
}
+
return true;
}
}
From 25e26f1f86bf246f93560710f41dcf5a26414770 Mon Sep 17 00:00:00 2001
From: Steve2020 <841532108@qq.com>
Date: Sun, 1 May 2022 13:45:25 +0800
Subject: [PATCH 35/40] =?UTF-8?q?=E6=B7=BB=E5=8A=A0(0746.=E4=BD=BF?=
=?UTF-8?q?=E7=94=A8=E6=9C=80=E5=B0=8F=E8=8A=B1=E8=B4=B9=E7=88=AC=E6=A5=BC?=
=?UTF-8?q?=E6=A2=AF.md)=EF=BC=9A=E5=A2=9E=E5=8A=A0typescript=E7=89=88?=
=?UTF-8?q?=E6=9C=AC?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
problems/0746.使用最小花费爬楼梯.md | 23 ++++++++++++++++++++
1 file changed, 23 insertions(+)
diff --git a/problems/0746.使用最小花费爬楼梯.md b/problems/0746.使用最小花费爬楼梯.md
index c356955a..5931fc8a 100644
--- a/problems/0746.使用最小花费爬楼梯.md
+++ b/problems/0746.使用最小花费爬楼梯.md
@@ -266,7 +266,30 @@ var minCostClimbingStairs = function(cost) {
};
```
+### TypeScript
+
+```typescript
+function minCostClimbingStairs(cost: number[]): number {
+ /**
+ dp[i]: 走到第i阶需要花费的最少金钱
+ dp[0]: cost[0];
+ dp[1]: cost[1];
+ ...
+ dp[i]: min(dp[i - 1], dp[i - 2]) + cost[i];
+ */
+ const dp: number[] = [];
+ const length: number = cost.length;
+ dp[0] = cost[0];
+ dp[1] = cost[1];
+ for (let i = 2; i <= length; i++) {
+ dp[i] = Math.min(dp[i - 1], dp[i - 2]) + cost[i];
+ }
+ return Math.min(dp[length - 1], dp[length - 2]);
+};
+```
+
### C
+
```c
int minCostClimbingStairs(int* cost, int costSize){
//开辟dp数组,大小为costSize
From 8c596b161a140a76ea57130ac61a009308bd277c Mon Sep 17 00:00:00 2001
From: Beim <1497359184@qq.com>
Date: Sun, 1 May 2022 15:45:58 +0800
Subject: [PATCH 36/40] modify_problems_0383
---
README.md | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/README.md b/README.md
index 1d7f219d..3d44ca69 100644
--- a/README.md
+++ b/README.md
@@ -31,7 +31,7 @@
-# LeetCode 刷题攻略
+# LeetCode 刷题攻略1111
## 刷题攻略的背景
@@ -254,7 +254,7 @@
33. [二叉树:构造一棵搜索树](./problems/0108.将有序数组转换为二叉搜索树.md)
34. [二叉树:搜索树转成累加树](./problems/0538.把二叉搜索树转换为累加树.md)
35. [二叉树:总结篇!(需要掌握的二叉树技能都在这里了)](./problems/二叉树总结篇.md)
-
+
## 回溯算法
题目分类大纲如下:
From 00b5e2aa64f49ce9273aca6aa8074d98fe4e489a Mon Sep 17 00:00:00 2001
From: eat to 160 pounds <2915390277@qq.com>
Date: Fri, 6 May 2022 15:06:32 +0800
Subject: [PATCH 37/40] =?UTF-8?q?131=E5=88=86=E5=89=B2=E5=AD=97=E7=AC=A6?=
=?UTF-8?q?=E4=B8=B2=E6=9B=B4=E6=B8=85=E6=A5=9A=E7=9A=84typescript?=
=?UTF-8?q?=E7=89=88=E6=9C=AC?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
problems/0131.分割回文串.md | 41 ++++++++++++++++++--------------
1 file changed, 23 insertions(+), 18 deletions(-)
diff --git a/problems/0131.分割回文串.md b/problems/0131.分割回文串.md
index 10b747cb..7a702898 100644
--- a/problems/0131.分割回文串.md
+++ b/problems/0131.分割回文串.md
@@ -454,31 +454,36 @@ var partition = function(s) {
```typescript
function partition(s: string): string[][] {
- function isPalindromeStr(s: string, left: number, right: number): boolean {
- while (left < right) {
- if (s[left++] !== s[right--]) {
- return false;
+ const res: string[][] = []
+ const path: string[] = []
+ const isHuiwen = (
+ str: string,
+ startIndex: number,
+ endIndex: number
+ ): boolean => {
+ for (; startIndex < endIndex; startIndex++, endIndex--) {
+ if (str[startIndex] !== str[endIndex]) {
+ return false
}
}
- return true;
+ return true
}
- function backTracking(s: string, startIndex: number, route: string[]): void {
- let length: number = s.length;
- if (length === startIndex) {
- resArr.push(route.slice());
- return;
+ const rec = (str: string, index: number): void => {
+ if (index >= str.length) {
+ res.push([...path])
+ return
}
- for (let i = startIndex; i < length; i++) {
- if (isPalindromeStr(s, startIndex, i)) {
- route.push(s.slice(startIndex, i + 1));
- backTracking(s, i + 1, route);
- route.pop();
+ for (let i = index; i < str.length; i++) {
+ if (!isHuiwen(str, index, i)) {
+ continue
}
+ path.push(str.substring(index, i + 1))
+ rec(str, i + 1)
+ path.pop()
}
}
- const resArr: string[][] = [];
- backTracking(s, 0, []);
- return resArr;
+ rec(s, 0)
+ return res
};
```
From 0e5e657a6d5ba057e8dfa77019b25c5404fe9a9b Mon Sep 17 00:00:00 2001
From: 243wresfdxvc
Date: Tue, 10 May 2022 23:04:35 +0000
Subject: [PATCH 38/40] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=200404.=E5=B7=A6?=
=?UTF-8?q?=E5=8F=B6=E5=AD=90=E4=B9=8B=E5=92=8C.md=20C=E8=AF=AD=E8=A8=80?=
=?UTF-8?q?=E8=A7=A3=E6=B3=95?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
problems/0404.左叶子之和.md | 49 ++++++++++++++++++++++++++++++++
1 file changed, 49 insertions(+)
diff --git a/problems/0404.左叶子之和.md b/problems/0404.左叶子之和.md
index 6420da81..d7fd629e 100644
--- a/problems/0404.左叶子之和.md
+++ b/problems/0404.左叶子之和.md
@@ -466,6 +466,55 @@ func sumOfLeftLeaves(_ root: TreeNode?) -> Int {
}
```
+## C
+递归法:
+```c
+int sumOfLeftLeaves(struct TreeNode* root){
+ // 递归结束条件:若当前结点为空,返回0
+ if(!root)
+ return 0;
+
+ // 递归取左子树的左结点和和右子树的左结点和
+ int leftValue = sumOfLeftLeaves(root->left);
+ int rightValue = sumOfLeftLeaves(root->right);
+
+ // 若当前结点的左结点存在,且其为叶子结点。取它的值
+ int midValue = 0;
+ if(root->left && (!root->left->left && !root->left->right))
+ midValue = root->left->val;
+
+ return leftValue + rightValue + midValue;
+}
+```
+
+迭代法:
+```c
+int sumOfLeftLeaves(struct TreeNode* root){
+ struct TreeNode* stack[1000];
+ int stackTop = 0;
+
+ // 若传入root结点不为空,将其入栈
+ if(root)
+ stack[stackTop++] = root;
+
+ int sum = 0;
+ //若栈不为空,进行循环
+ while(stackTop) {
+ // 出栈栈顶元素
+ struct TreeNode *topNode = stack[--stackTop];
+ // 若栈顶元素的左孩子为左叶子结点,将其值加入sum中
+ if(topNode->left && (!topNode->left->left && !topNode->left->right))
+ sum += topNode->left->val;
+
+ // 若当前栈顶结点有左右孩子。将他们加入栈中进行遍历
+ if(topNode->right)
+ stack[stackTop++] = topNode->right;
+ if(topNode->left)
+ stack[stackTop++] = topNode->left;
+ }
+ return sum;
+}
+```
-----------------------
From a5db99363b1bca72345036228776a0320242c8c4 Mon Sep 17 00:00:00 2001
From: SevenMonths
Date: Sun, 15 May 2022 15:35:08 +0800
Subject: [PATCH 39/40] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=EF=BC=880035.=E6=90=9C?=
=?UTF-8?q?=E7=B4=A2=E6=8F=92=E5=85=A5=E4=BD=8D=E7=BD=AE.md=EF=BC=89?=
=?UTF-8?q?=EF=BC=9A=E5=A2=9E=E5=8A=A0PHP=E7=89=88=E6=9C=AC?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
problems/0035.搜索插入位置.md | 25 +++++++++++++++++++++++++
1 file changed, 25 insertions(+)
diff --git a/problems/0035.搜索插入位置.md b/problems/0035.搜索插入位置.md
index 9a770703..8a8f9706 100644
--- a/problems/0035.搜索插入位置.md
+++ b/problems/0035.搜索插入位置.md
@@ -318,6 +318,31 @@ func searchInsert(_ nums: [Int], _ target: Int) -> Int {
```
+### PHP
+
+```php
+// 二分法(1):[左闭右闭]
+function searchInsert($nums, $target)
+{
+ $n = count($nums);
+ $l = 0;
+ $r = $n - 1;
+ while ($l <= $r) {
+ $mid = floor(($l + $r) / 2);
+ if ($nums[$mid] > $target) {
+ // 下次搜索在左区间:[$l,$mid-1]
+ $r = $mid - 1;
+ } else if ($nums[$mid] < $target) {
+ // 下次搜索在右区间:[$mid+1,$r]
+ $l = $mid + 1;
+ } else {
+ // 命中返回
+ return $mid;
+ }
+ }
+ return $r + 1;
+}
+```
-----------------------
From 83c2fd2454bbbbeda82725d2c38a2b577d7434c6 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=E7=A8=8B=E5=BA=8F=E5=91=98Carl?=
Date: Wed, 18 May 2022 09:27:56 +0800
Subject: [PATCH 40/40] Update README.md
---
README.md | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/README.md b/README.md
index 3d44ca69..01cab0b0 100644
--- a/README.md
+++ b/README.md
@@ -31,7 +31,7 @@
-# LeetCode 刷题攻略1111
+# LeetCode 刷题攻略
## 刷题攻略的背景