之前做小红书的笔试题,一道很简单的01背包问题答案一直不对,结束后再看了看代码才发现是dp数组的初始化写错了。
错误版本:
let dp = new Array(n+1).fill(new Array(h+1).fill(0))
正确版本:
let dp = new Array(n+1).fill(0).map(() => Array(h+1).fill(0))
前者直接使用fill函数将每一行都用h+1个0填满了,但是fill() 会用对象的引用来填充数组,因此这每一行数据都会互相影响,导致dp数组不断累加。
后者使用map函数,该数组中的每个元素都是调用一次提供的函数后的返回值,因此不会存在互相影响的问题。