From d692ffe034aa1d7af9a4e5d76999ee6a506c23b9 Mon Sep 17 00:00:00 2001
From: Steve2020 <841532108@qq.com>
Date: Tue, 3 May 2022 21:51:21 +0800
Subject: [PATCH 1/6] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=EF=BC=880416.=E5=88=86?=
=?UTF-8?q?=E5=89=B2=E7=AD=89=E5=92=8C=E5=AD=90=E9=9B=86.md=EF=BC=89?=
=?UTF-8?q?=EF=BC=9A=E5=A2=9E=E5=8A=A0typescript?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
problems/0416.分割等和子集.md | 55 +++++++++++++++++++++++++++++
1 file changed, 55 insertions(+)
diff --git a/problems/0416.分割等和子集.md b/problems/0416.分割等和子集.md
index b24fb365..20b7782d 100644
--- a/problems/0416.分割等和子集.md
+++ b/problems/0416.分割等和子集.md
@@ -416,6 +416,61 @@ var canPartition = function(nums) {
};
```
+TypeScript:
+
+> 一维数组,简洁
+
+```typescript
+function canPartition(nums: number[]): boolean {
+ const sum: number = nums.reduce((pre, cur) => pre + cur);
+ if (sum % 2 === 1) return false;
+ const bagSize: number = sum / 2;
+ const goodsNum: number = nums.length;
+ const dp: number[] = new Array(bagSize + 1).fill(0);
+ for (let i = 0; i < goodsNum; i++) {
+ for (let j = bagSize; j >= nums[i]; j--) {
+ dp[j] = Math.max(dp[j], dp[j - nums[i]] + nums[i]);
+ }
+ }
+ return dp[bagSize] === bagSize;
+};
+```
+
+> 二维数组,易懂
+
+```typescript
+function canPartition(nums: number[]): boolean {
+ /**
+ weightArr = nums;
+ valueArr = nums;
+ bagSize = sum / 2; (sum为nums各元素总和);
+ 按照0-1背包处理
+ */
+ const sum: number = nums.reduce((pre, cur) => pre + cur);
+ if (sum % 2 === 1) return false;
+ const bagSize: number = sum / 2;
+ const weightArr: number[] = nums;
+ const valueArr: number[] = nums;
+ const goodsNum: number = weightArr.length;
+ const dp: number[][] = new Array(goodsNum)
+ .fill(0)
+ .map(_ => new Array(bagSize + 1).fill(0));
+ for (let i = weightArr[0]; i <= bagSize; i++) {
+ dp[0][i] = valueArr[0];
+ }
+ for (let i = 1; i < goodsNum; i++) {
+ for (let j = 0; j <= bagSize; j++) {
+ if (j < weightArr[i]) {
+ dp[i][j] = dp[i - 1][j];
+ } else {
+ dp[i][j] = Math.max(dp[i - 1][j], dp[i - 1][j - weightArr[i]] + valueArr[i]);
+ }
+ }
+ }
+ return dp[goodsNum - 1][bagSize] === bagSize;
+};
+```
+
From 65cde78559bf18cced2e91b57fba8f92a66437a4 Mon Sep 17 00:00:00 2001
From: Steve2020 <841532108@qq.com>
Date: Wed, 4 May 2022 12:57:05 +0800
Subject: [PATCH 2/6] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=EF=BC=881049.=E6=9C=80?=
=?UTF-8?q?=E5=90=8E=E4=B8=80=E5=9D=97=E7=9F=B3=E5=A4=B4=E7=9A=84=E9=87=8D?=
=?UTF-8?q?=E9=87=8FII.md=EF=BC=89=EF=BC=9A=E5=A2=9E=E5=8A=A0typescript?=
=?UTF-8?q?=E7=89=88=E6=9C=AC?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../1049.最后一块石头的重量II.md | 21 +++++++++++++++++++
1 file changed, 21 insertions(+)
diff --git a/problems/1049.最后一块石头的重量II.md b/problems/1049.最后一块石头的重量II.md
index ee0ddef2..3d256c3d 100644
--- a/problems/1049.最后一块石头的重量II.md
+++ b/problems/1049.最后一块石头的重量II.md
@@ -277,5 +277,26 @@ var lastStoneWeightII = function (stones) {
};
```
+TypeScript:
+
+```typescript
+function lastStoneWeightII(stones: number[]): number {
+ const sum: number = stones.reduce((pre, cur) => pre + cur);
+ const bagSize: number = Math.floor(sum / 2);
+ const weightArr: number[] = stones;
+ const valueArr: number[] = stones;
+ const goodsNum: number = weightArr.length;
+ const dp: number[] = new Array(bagSize + 1).fill(0);
+ for (let i = 0; i < goodsNum; i++) {
+ for (let j = bagSize; j >= weightArr[i]; j--) {
+ dp[j] = Math.max(dp[j], dp[j - weightArr[i]] + valueArr[i]);
+ }
+ }
+ return sum - dp[bagSize] * 2;
+};
+```
+
+
+
-----------------------
From b9b7c1530abf7a4b6b68b0f732b5a69cbaae772c Mon Sep 17 00:00:00 2001
From: Steve2020 <841532108@qq.com>
Date: Wed, 4 May 2022 23:48:12 +0800
Subject: [PATCH 3/6] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=EF=BC=880494.=E7=9B=AE?=
=?UTF-8?q?=E6=A0=87=E5=92=8C.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/0494.目标和.md | 19 +++++++++++++++++++
1 file changed, 19 insertions(+)
diff --git a/problems/0494.目标和.md b/problems/0494.目标和.md
index 99b76834..8ce1f6f1 100644
--- a/problems/0494.目标和.md
+++ b/problems/0494.目标和.md
@@ -351,6 +351,25 @@ const findTargetSumWays = (nums, target) => {
};
```
+TypeScript:
+
+```typescript
+function findTargetSumWays(nums: number[], target: number): number {
+ const sum: number = nums.reduce((pre, cur) => pre + cur);
+ if (Math.abs(target) > sum) return 0;
+ if ((target + sum) % 2 === 1) return 0;
+ const bagSize: number = (target + sum) / 2;
+ const dp: number[] = new Array(bagSize + 1).fill(0);
+ dp[0] = 1;
+ for (let i = 0; i < nums.length; i++) {
+ for (let j = bagSize; j >= nums[i]; j--) {
+ dp[j] += dp[j - nums[i]];
+ }
+ }
+ return dp[bagSize];
+};
+```
+
-----------------------
From 3c88974f92926f9280d71ea964bdb36b6f097044 Mon Sep 17 00:00:00 2001
From: Steve2020 <841532108@qq.com>
Date: Thu, 5 May 2022 14:15:00 +0800
Subject: [PATCH 4/6] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=EF=BC=880474.=E4=B8=80?=
=?UTF-8?q?=E5=92=8C=E9=9B=B6.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/0474.一和零.md | 123 +++++++++++++++++++++++++++++++++++++
1 file changed, 123 insertions(+)
diff --git a/problems/0474.一和零.md b/problems/0474.一和零.md
index 964df4a8..d38ce03f 100644
--- a/problems/0474.一和零.md
+++ b/problems/0474.一和零.md
@@ -323,6 +323,129 @@ const findMaxForm = (strs, m, n) => {
};
```
+TypeScript:
+
+> 滚动数组,二维数组法
+
+```typescript
+type BinaryInfo = { numOfZero: number, numOfOne: number };
+function findMaxForm(strs: string[], m: number, n: number): number {
+ const goodsNum: number = strs.length;
+ const dp: number[][] = new Array(m + 1).fill(0)
+ .map(_ => new Array(n + 1).fill(0));
+ for (let i = 0; i < goodsNum; i++) {
+ const { numOfZero, numOfOne } = countBinary(strs[i]);
+ for (let j = m; j >= numOfZero; j--) {
+ for (let k = n; k >= numOfOne; k--) {
+ dp[j][k] = Math.max(dp[j][k], dp[j - numOfZero][k - numOfOne] + 1);
+ }
+ }
+ }
+ return dp[m][n];
+};
+function countBinary(str: string): BinaryInfo {
+ let numOfZero: number = 0,
+ numOfOne: number = 0;
+ for (let s of str) {
+ if (s === '0') {
+ numOfZero++;
+ } else {
+ numOfOne++;
+ }
+ }
+ return { numOfZero, numOfOne };
+}
+```
+
+> 传统背包,三维数组法
+
+```typescript
+type BinaryInfo = { numOfZero: number, numOfOne: number };
+function findMaxForm(strs: string[], m: number, n: number): number {
+ /**
+ dp[i][j][k]: 前i个物品中, 背包的0容量为j, 1容量为k, 最多能放的物品数量
+ */
+ const goodsNum: number = strs.length;
+ const dp: number[][][] = new Array(goodsNum).fill(0)
+ .map(_ => new Array(m + 1)
+ .fill(0)
+ .map(_ => new Array(n + 1).fill(0))
+ );
+ const { numOfZero, numOfOne } = countBinary(strs[0]);
+ for (let i = numOfZero; i <= m; i++) {
+ for (let j = numOfOne; j <= n; j++) {
+ dp[0][i][j] = 1;
+ }
+ }
+ for (let i = 1; i < goodsNum; i++) {
+ const { numOfZero, numOfOne } = countBinary(strs[i]);
+ for (let j = 0; j <= m; j++) {
+ for (let k = 0; k <= n; k++) {
+ if (j < numOfZero || k < numOfOne) {
+ dp[i][j][k] = dp[i - 1][j][k];
+ } else {
+ dp[i][j][k] = Math.max(dp[i - 1][j][k], dp[i - 1][j - numOfZero][k - numOfOne] + 1);
+ }
+ }
+ }
+ }
+ return dp[dp.length - 1][m][n];
+};
+function countBinary(str: string): BinaryInfo {
+ let numOfZero: number = 0,
+ numOfOne: number = 0;
+ for (let s of str) {
+ if (s === '0') {
+ numOfZero++;
+ } else {
+ numOfOne++;
+ }
+ }
+ return { numOfZero, numOfOne };
+}
+```
+
+> 回溯法(会超时)
+
+```typescript
+function findMaxForm(strs: string[], m: number, n: number): number {
+ /**
+ 思路:暴力枚举strs的所有子集,记录符合条件子集的最大长度
+ */
+ let resMax: number = 0;
+ backTrack(strs, m, n, 0, []);
+ return resMax;
+ function backTrack(
+ strs: string[], m: number, n: number,
+ startIndex: number, route: string[]
+ ): void {
+ if (startIndex === strs.length) return;
+ for (let i = startIndex, length = strs.length; i < length; i++) {
+ route.push(strs[i]);
+ if (isValidSubSet(route, m, n)) {
+ resMax = Math.max(resMax, route.length);
+ backTrack(strs, m, n, i + 1, route);
+ }
+ route.pop();
+ }
+ }
+};
+function isValidSubSet(strs: string[], m: number, n: number): boolean {
+ let zeroNum: number = 0,
+ oneNum: number = 0;
+ strs.forEach(str => {
+ for (let s of str) {
+ if (s === '0') {
+ zeroNum++;
+ } else {
+ oneNum++;
+ }
+ }
+ });
+ return zeroNum <= m && oneNum <= n;
+}
+```
+
-----------------------
From 1e9cecb665acd511660a9c8c8af48868e20bb871 Mon Sep 17 00:00:00 2001
From: Steve2020 <841532108@qq.com>
Date: Thu, 5 May 2022 16:53:38 +0800
Subject: [PATCH 5/6] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=EF=BC=88=E8=83=8C?=
=?UTF-8?q?=E5=8C=85=E9=97=AE=E9=A2=98=E7=90=86=E8=AE=BA=E5=9F=BA=E7=A1=80?=
=?UTF-8?q?=E5=AE=8C=E5=85=A8=E8=83=8C=E5=8C=85.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
---
.../背包问题理论基础完全背包.md | 21 +++++++++++++++++++
1 file changed, 21 insertions(+)
diff --git a/problems/背包问题理论基础完全背包.md b/problems/背包问题理论基础完全背包.md
index faa1dc46..936a80c7 100644
--- a/problems/背包问题理论基础完全背包.md
+++ b/problems/背包问题理论基础完全背包.md
@@ -340,6 +340,27 @@ function test_completePack2() {
}
```
+TypeScript:
+
+```typescript
+// 先遍历物品,再遍历背包容量
+function test_CompletePack(): void {
+ const weight: number[] = [1, 3, 4];
+ const value: number[] = [15, 20, 30];
+ const bagSize: number = 4;
+ const dp: number[] = new Array(bagSize + 1).fill(0);
+ for (let i = 0; i < weight.length; i++) {
+ for (let j = weight[i]; j <= bagSize; j++) {
+ dp[j] = Math.max(dp[j], dp[j - weight[i]] + value[i]);
+ }
+ }
+ console.log(dp);
+}
+test_CompletePack();
+```
+
+
+
-----------------------
From b82984e24b23940aa95da2a0283ae4cf3c706f7a Mon Sep 17 00:00:00 2001
From: Steve2020 <841532108@qq.com>
Date: Thu, 5 May 2022 18:11:41 +0800
Subject: [PATCH 6/6] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=EF=BC=880518.=E9=9B=B6?=
=?UTF-8?q?=E9=92=B1=E5=85=91=E6=8D=A2II.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/0518.零钱兑换II.md | 15 +++++++++++++++
1 file changed, 15 insertions(+)
diff --git a/problems/0518.零钱兑换II.md b/problems/0518.零钱兑换II.md
index e72c5f85..8faf6698 100644
--- a/problems/0518.零钱兑换II.md
+++ b/problems/0518.零钱兑换II.md
@@ -258,6 +258,21 @@ const change = (amount, coins) => {
}
```
+TypeScript:
+
+```typescript
+function change(amount: number, coins: number[]): number {
+ const dp: number[] = new Array(amount + 1).fill(0);
+ dp[0] = 1;
+ for (let i = 0, length = coins.length; i < length; i++) {
+ for (let j = coins[i]; j <= amount; j++) {
+ dp[j] += dp[j - coins[i]];
+ }
+ }
+ return dp[amount];
+};
+```
+
-----------------------