diff --git "a/problems/0053.346円234円200円345円244円247円345円255円220円345円272円217円345円222円214円357円274円210円345円212円250円346円200円201円350円247円204円345円210円222円357円274円211円.md" "b/problems/0053.346円234円200円345円244円247円345円255円220円345円272円217円345円222円214円357円274円210円345円212円250円346円200円201円350円247円204円345円210円222円357円274円211円.md" index f1b6470985..70ad7a8482 100644 --- "a/problems/0053.346円234円200円345円244円247円345円255円220円345円272円217円345円222円214円357円274円210円345円212円250円346円200円201円350円247円204円345円210円222円357円274円211円.md" +++ "b/problems/0053.346円234円200円345円244円247円345円255円220円345円272円217円345円222円214円357円274円210円345円212円250円346円200円201円350円247円204円345円210円222円357円274円211円.md" @@ -226,18 +226,20 @@ object Solution { ```typescript function maxSubArray(nums: number[]): number { - /** - dp[i]:以nums[i]结尾的最大和 - */ - const dp: number[] = [] - dp[0] = nums[0]; - let resMax: number = 0; - for (let i = 1; i < nums.length; i++) { - dp[i] = Math.max(dp[i - 1] + nums[i], nums[i]); - resMax = Math.max(resMax, dp[i]); + const len = nums.length + if (len === 1) return nums[0] + + const dp: number[] = new Array(len) + let resMax: number = dp[0] = nums[0] + + for (let i = 1; i < len; i++) { + dp[i] = Math.max(dp[i - 1] + nums[i], nums[i]) + // 注意值为负数的情况 + if (dp[i]> resMax) resMax = dp[i] } - return resMax; -}; + + return resMax +} ``` diff --git "a/problems/0392.345円210円244円346円226円255円345円255円220円345円272円217円345円210円227円.md" "b/problems/0392.345円210円244円346円226円255円345円255円220円345円272円217円345円210円227円.md" index f7863c9499..ebd567cbb7 100644 --- "a/problems/0392.345円210円244円346円226円255円345円255円220円345円272円217円345円210円227円.md" +++ "b/problems/0392.345円210円244円346円226円255円345円255円220円345円272円217円345円210円227円.md" @@ -216,26 +216,51 @@ const isSubsequence = (s, t) => { ### TypeScript: +> 二维数组 + ```typescript function isSubsequence(s: string, t: string): boolean { /** dp[i][j]: s的前i-1个,t的前j-1个,最长公共子序列的长度 */ - const sLen: number = s.length, - tLen: number = t.length; - const dp: number[][] = new Array(sLen + 1).fill(0) - .map(_ => new Array(tLen + 1).fill(0)); + const sLen = s.length + const tLen = t.length + const dp: number[][] = new Array(sLen + 1).fill(0).map(_ => new Array(tLen + 1).fill(0)) + for (let i = 1; i <= sLen; i++) { for (let j = 1; j <= tLen; j++) { - if (s[i - 1] === t[j - 1]) { - dp[i][j] = dp[i - 1][j - 1] + 1; - } else { - dp[i][j] = Math.max(dp[i - 1][j], dp[i][j - 1]); - } + if (s[i - 1] === t[j - 1]) dp[i][j] = dp[i - 1][j - 1] + 1 + // 只需要取 j-2 的 dp 值即可,不用考虑 i-2 + else dp[i][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: diff --git "a/problems/1035.344円270円215円347円233円270円344円272円244円347円232円204円347円272円277円.md" "b/problems/1035.344円270円215円347円233円270円344円272円244円347円232円204円347円272円277円.md" index ff9e5dc4e3..e0625a2ba3 100644 --- "a/problems/1035.344円270円215円347円233円270円344円272円244円347円232円204円347円272円277円.md" +++ "b/problems/1035.344円270円215円347円233円270円344円272円244円347円232円204円347円272円277円.md" @@ -221,6 +221,8 @@ const maxUncrossedLines = (nums1, nums2) => { ### TypeScript: +> 二维数组 + ```typescript 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] +} +``` + +