在LeetCode上解决最长回文子串问题时,我发现在我的两个相同的解决方案中,使用动态分配的一个使用了244 MB的RAM,而另一个只使用了10 MB的RAM。
静态分配解决方案(动态解决方案在代码的注解部分)
char * longestPalindrome(char * s){
int n = strlen(s);
int ps[n][n]; //int *ps = (int *)malloc(n * n * sizeof(int));
memset(ps, 0, sizeof(ps[0][0]) * n * n);
int maxi = 0, maxj = 0;
for (int i = 0; i < n; i++)
{
ps[i][i] = 1; //ps[i*n+i] = 1;
}
for (int l = 2; l <= n; l++)
{
for (int i = 0; i <= n - l; i++)
{
int j = i + l - 1;
if (i == j - 1)
{
if (ps[i][j] = (s[i] == s[j])) //if (ps[i*n+j] = (s[i] == s[j]))
{
maxi = i;
maxj = j;
}
}
else
{
if (ps[i][j] = (s[i] == s[j] && ps[i + 1][j - 1])) //if (ps[i*n+j] = (s[i] == s[j] && ps[(i + 1)*n+(j - 1)]))
{
maxi = i;
maxj = j;
}
}
}
} //free(ps)
char *p = &s[maxi];
s[maxj + 1] = '\0';
return p;
}
1条答案
按热度按时间68de4m5k1#
您正在堆栈上分配
ps
。如果这在leetcode中真的有效,那么显然leetcode既允许它自己的非常大的堆栈分配,以避免崩溃,而且leetcode没有将其计算为内存使用。简而言之,看起来你在以一种不允许的方式欺骗leetcode。244 MB是一个惊人的堆栈大小。C编译器的典型默认堆栈大小是8MB。