当我用leetcode解决动态编程问题时,我使用了
像dp[m][n]={0}
这样的语句来初始化数组,但有时无法将数组设置为全零,从而导致错误的答案。
但是,在将代码更改为memset(dp,0,sizeof(dp))
之后,dp数组已成功初始化。
class Solution {
public:
int uniquePathsWithObstacles(vector<vector<int>>& obstacleGrid) {
int m = obstacleGrid.size();
int n = obstacleGrid[0].size();
unsigned long dp[m][n];//
//unsigned long dp[m][n] = {0}; // failed when printed out
memset(dp,0,sizeof(dp)); // success
//....
}
}
我当时认为问题是由于数组大小是动态的。这意味着我初始化二维动态数组的方式是错误的。应该使用指针或向量初始化这种动态尺寸的2d数组。
但是令我困扰的是,从另一个角度来看,二维数组是存储在堆栈中的局部变量。这意味着函数返回时使用的空间将是可用的。
这样,每次2d数组都会使用dp[m][n] ={0}
获得一些全新的全零空间。不幸的是,结果证明我错了,我必须使用memset()
来确保将数组初始化为全零。
因此,我想知道有人可以在此C ++方面给我一些帮助。