最近在力扣上刷动态规划的题,常常需要创建一个二维数组。
起初楼主使用如下代码创建了一个二维数组,自以为简单方便的。(错误示范)
// 比如说创建一个9*9的二维数组,这样的
const dp = new Array(9).fill(Array.from({length: 9}))
然后呢,明明算法是正确的,但是老是AC不了,输出的值是错误的。
找了好久的原因,结果错误就是万万不该用Array.from,循环创建多个数组。
首先看下from方法的定义:
创建的是一个浅拷贝的数组实例,意味着我所创建的dp[i][j]都指向的是原来{length: 9}的对象的地址。
这样自然就造成了,后面的值输出的错误了。
打脸了,不过遇到问题也是值得了,下次不会再放了。
额,难道前端创建二维数组,只能老老实实如下所示吗?
const dp = new Array(9)
for (let k=0; k<=9; k++) {
dp[k] = new Array(9)
}
最后附一下楼主在力扣上做的那道题《72 . 编辑距离》
/**
* @param {string} word1
* @param {string} word2
* @return {number}
*/
var minDistance = function(word1, word2) {
const len1 = word1.length
const len2 = word2.length
if (!len1 || !len2) return Math.max(len1, len2)
const dp = new Array(len1 + 1)
for (let k=0; k<=len1; k++) {
dp[k] = new Array(len2 + 1)
}
for (let i=0; i<=len1; i++) {
dp[i][0] = i
}
for (let j=0; j<=len2; j++) {
dp[0][j] = j
}
for (let i=1; i<=len1; i++) {
for (let j=1; j<=len2; j++) {
if (word1[i-1] == word2[j-1]) {
dp[i][j] = dp[i-1][j-1]
} else {
dp[i][j] = 1 + Math.min(dp[i-1][j-1], dp[i-1][j], dp[i][j-1])
}
}
}
return dp[len1][len2]
};
本文地址:https://blog.csdn.net/romantic_love/article/details/107622351
如对本文有疑问, 点击进行留言回复!!
同事牛逼啊,写了个隐藏 bug,我排查了 3 天才解决问题!
【JavaScript笔记(一)】万丈高楼平地起 - 基本概念篇
轻松解决 org.apache.taglibs.standard.tlv.JstlCoreTLV 困惑
网友评论