Merge pull request #2323 from xin0907/master

update: 0053.最大子序和修复 ts 解法 BUG & 1035.不相交线 ts 新增滚动数组解法 & 优化 1035.不相交的线 ts 滚动数组代码注释 & 优化 0392.判断子序列 ts 二维数组解法代码逻辑 & 0392.判断子序列 ts 新增滚动数组解法。
This commit is contained in:
程序员Carl
2023-11-06 09:48:32 +08:00
committed by GitHub
3 changed files with 79 additions and 22 deletions

View File

@ -226,18 +226,20 @@ object Solution {
```typescript ```typescript
function maxSubArray(nums: number[]): number { function maxSubArray(nums: number[]): number {
/** const len = nums.length
dp[i]以nums[i]结尾的最大和 if (len === 1) return nums[0]
*/
const dp: number[] = [] const dp: number[] = new Array(len)
dp[0] = nums[0]; let resMax: number = dp[0] = nums[0]
let resMax: number = 0;
for (let i = 1; i < nums.length; i++) { for (let i = 1; i < len; i++) {
dp[i] = Math.max(dp[i - 1] + nums[i], nums[i]); dp[i] = Math.max(dp[i - 1] + nums[i], nums[i])
resMax = Math.max(resMax, dp[i]); // 注意值为负数的情况
if (dp[i] > resMax) resMax = dp[i]
} }
return resMax;
}; return resMax
}
``` ```

View File

@ -216,26 +216,51 @@ const isSubsequence = (s, t) => {
### TypeScript ### TypeScript
> 二维数组
```typescript ```typescript
function isSubsequence(s: string, t: string): boolean { function isSubsequence(s: string, t: string): boolean {
/** /**
dp[i][j]: s的前i-1个t的前j-1个最长公共子序列的长度 dp[i][j]: s的前i-1个t的前j-1个最长公共子序列的长度
*/ */
const sLen: number = s.length, const sLen = s.length
tLen: number = t.length; const tLen = t.length
const dp: number[][] = new Array(sLen + 1).fill(0) const dp: number[][] = new Array(sLen + 1).fill(0).map(_ => new Array(tLen + 1).fill(0))
.map(_ => new Array(tLen + 1).fill(0));
for (let i = 1; i <= sLen; i++) { for (let i = 1; i <= sLen; i++) {
for (let j = 1; j <= tLen; j++) { for (let j = 1; j <= tLen; j++) {
if (s[i - 1] === t[j - 1]) { if (s[i - 1] === t[j - 1]) dp[i][j] = dp[i - 1][j - 1] + 1
dp[i][j] = dp[i - 1][j - 1] + 1; // 只需要取 j-2 的 dp 值即可,不用考虑 i-2
} else { else dp[i][j] = dp[i][j - 1]
dp[i][j] = Math.max(dp[i - 1][j], dp[i][j - 1]);
}
} }
} }
return dp[sLen][tLen] === s.length; return dp[sLen][tLen] === s.length
}; }
```
> 滚动数组
```typescript
function isSubsequence(s: string, t: string): boolean {
const sLen = s.length
const tLen = t.length
const dp: number[] = new Array(tLen + 1).fill(0)
for (let i = 1; i <= sLen; i++) {
let prev: number = 0;
let temp: number = 0;
for (let j = 1; j <= tLen; j++) {
// 备份一下当前状态(经过上层迭代后的)
temp = dp[j]
// prev 相当于 dp[j-1](累加了上层的状态)
// 如果单纯 dp[j-1] 则不会包含上层状态
if (s[i - 1] === t[j - 1]) dp[j] = prev + 1
else dp[j] = dp[j - 1]
// 继续使用上一层状态更新参数用于当前层下一个状态
prev = temp
}
}
return dp[tLen] === sLen
}
``` ```
### Go ### Go

View File

@ -221,6 +221,8 @@ const maxUncrossedLines = (nums1, nums2) => {
### TypeScript ### TypeScript
> 二维数组
```typescript ```typescript
function maxUncrossedLines(nums1: number[], nums2: number[]): number { function maxUncrossedLines(nums1: number[], nums2: number[]): number {
/** /**
@ -243,6 +245,34 @@ function maxUncrossedLines(nums1: number[], nums2: number[]): number {
}; };
``` ```
> 滚动数组
```typescript
function maxUncrossedLines(nums1: number[], nums2: number[]): number {
const len1 = nums1.length
const len2 = nums2.length
const dp: number[] = new Array(len2 + 1).fill(0)
for (let i = 1; i <= len1; i++) {
let prev: number = 0;
let temp: number = 0;
for (let j = 1; j <= len2; j++) {
// 备份一下当前状态(经过上层迭代后的)
temp = dp[j]
// prev 相当于 dp[j-1](累加了上层的状态)
// 如果单纯 dp[j-1] 则不会包含上层状态
if (nums1[i - 1] === nums2[j - 1]) dp[j] = prev + 1
// dp[j] 表示之前的 dp[i][j-1]dp[j-1] 表示 dp[i-1][j]
else dp[j] = Math.max(dp[j], dp[j - 1])
// 继续使用上一层状态更新参数用于当前层下一个状态
prev = temp
}
}
return dp[len2]
}
```
<p align="center"> <p align="center">
<a href="https://programmercarl.com/other/kstar.html" target="_blank"> <a href="https://programmercarl.com/other/kstar.html" target="_blank">
<img src="../pics/网站星球宣传海报.jpg" width="1000"/> <img src="../pics/网站星球宣传海报.jpg" width="1000"/>