2017-08-05 134 views
0

解决*****请参考BLUEPIXY简评供液*****动态内存分配

我想在C https://leetcode.com/problems/pascals-triangle/description/

解决本文给出了问题

这是我解决问题的方法。 我认为解决方案没有问题,但动态分配内存对于2D array变得非常复杂。有人可以帮我弄清楚如何正确地分配内存到2D array。更新了基于BLUEPIXY建议的代码,我似乎仍然遇到了运行时错误。

/** 
* Return an array of arrays. 
* The sizes of the arrays are returned as *columnSizes array. 
* Note: Both returned array and *columnSizes array must be malloced, assume caller calls free(). 
*/ 
int** generate(int numRows, int** columnSizes) { 


    int i=0,j=0,numColumns =2; 

    columnSizes = (int **)malloc(numRows * sizeof(int *)); 
    for (i=0; i<numRows; i++) 
     columnSizes[i] = (int *)malloc(sizeof(int)); 

    int **returnArray = (int **)malloc(numRows * sizeof(int *)); 
    for (i=0; i<numRows; i++) 
     returnArray[i] = (int *)malloc((i+1) * sizeof(int)); 


    returnArray[0][0] = 1; 
    *columnSizes =1; 
    for(i=1;i<numRows;i++) 
    { 
     for(j=0;j<numColumns;j++) 
     { 
      if(j==0) 
       columnSizes[i][j] = returnArray[i-1][j]; 
      else if(j==(numColumns-1)) 
       columnSizes[i][j] = returnArray[i-1][j-1]; 
      else 
       returnArray[i][j] = returnArray[i-1][j-1] + returnArray[i-1][j]; 

      numColumns++; 
     } 
     *(columnSizes+i) = numColumns-1; 
    } 

    return returnArray; 
} 
+0

需要为每行更改(增加)numColumns。 – BLUEPIXY

+0

您还误解了'generate'函数的需求规格。 – BLUEPIXY

+0

@BLUEPIXY:哦,是的,谢谢你,我把它写在我的笔记本上。错过了输入。感谢您指出。尽管我仍然遇到错误。我会尽力弄清楚什么是错的。你有没有看到我分配内存的方式有什么问题? – CodeModeOn

回答

0

问题

(1)

columnSizes = (int **)malloc(numRows * sizeof(int *)); 
for (i=0; i<numRows; i++) 
    columnSizes[i] = (int *)malloc(sizeof(int)); 

应该

*columnSizes = malloc(numRows * sizeof(int)); 

(※没有必要从void *用C投)。

(2)

*columnSizes =1;//type of `*columnSizes` is `int *` 

应该是

**columnSizes = 1;//meant columnSizes[0] = 1; at caller side (main) 

(3)

columnSizes[i][j] = returnArray[i-1][j]; 
... 
columnSizes[i][j] = returnArray[i-1][j-1]; 

应该是

returnArray[i][j] = returnArray[i-1][j]; 
... 
returnArray[i][j] = returnArray[i-1][j-1]; 

因为这是错字。

(4)

numColumns++;移动到后for(j=0;j<numColumns;j++){ }

(5)

*(columnSizes+i) = numColumns-1; 

应该是

*(*columnSizes+i) = numColumns-1;//For reasons similar to (2) 

整个修复代码:

int** generate(int numRows, int** columnSizes) { 
    int i=0,j=0,numColumns =2; 

    *columnSizes = malloc(numRows * sizeof(int)); 

    int **returnArray = (int **)malloc(numRows * sizeof(int *)); 
    for (i=0; i<numRows; i++) 
     returnArray[i] = (int *)malloc((i+1) * sizeof(int)); 

    returnArray[0][0] = 1; 
    **columnSizes = 1; 
    for(i=1;i<numRows;i++) 
    { 
     for(j=0;j<numColumns;j++) 
     { 
      if(j==0) 
       returnArray[i][j] = returnArray[i-1][j]; 
      else if(j==(numColumns-1)) 
       returnArray[i][j] = returnArray[i-1][j-1]; 
      else 
       returnArray[i][j] = returnArray[i-1][j-1] + returnArray[i-1][j]; 
     } 
     numColumns++; 
     *(*columnSizes+i) = numColumns-1; 
    } 

    return returnArray; 
} 
+0

非常感谢BLUEPIXY,这让我对一切都非常了解。 – CodeModeOn

+0

不用客气。 – BLUEPIXY

0

只是这样做

int *arr = (int *)malloc(r * c * sizeof(int)); 

,并访问元素这样

int i, j, count = 0; 
    for (i = 0; i < r; i++) 
     for (j = 0; j < c; j++) 
     *(arr + i*c + j) = ++count; 

OR

如果你有指针的指针,然后你从这个代码获得一些帮助

int main() 
{ 
    int i,j; 
    int **p; 
    (p)=(int**)malloc(5*sizeof(int*)); 

    for(i=0;i<5;i++) 
    *(p+i)=(int*)malloc(4*sizeof(int)); 

    for(i=0;i<5;i++) 
    for(j=0;j<4;j++) 
    p[i][j]=2; 

    for(i=0;i<5;i++) 
    for(j=0;j<4;j++) 
    printf("%d",p[i][j]); 
} 
+0

Hi Tanuj,谢谢你的回应。我注意到你在这里提供的解决方案:http://www.geeksforgeeks.org/dynamically-allocate-2d-array-c/但在我的情况下,Leetcode函数的输入参数是一个指向指针的指针。这就是为什么我使用指向指针的指针分配内存的原因,第三个解决方案在同一个geeksforgeeks链接中。虽然似乎不适合我。当我返回时,它打印出一组空数组。 – CodeModeOn

+0

@CodeModeOn看到我更新的答案。 –

+0

感谢您的解决方案。我没有看到你的更新动态分配方法与我原来的文章相比有什么区别。我仍然尝试在Leetcode链接中插入您的解决方案,并将所有元素指定为值2以用于测试目的。它仍然给我5个NULL数组作为输出。 – CodeModeOn

0

如果您为编程练习所做的所有工作都打印出结果,为什么还要打扰任何存储?只需在这里使用解决方案。

How to efficiently calculate a row in pascal's triangle?

关于多维数组和C,存在对这样的事情没有本地支持。因此,您必须使用一个或多个一维存储和技巧来建立自己的索引,以便将索引存入该存储。

最简单的事情,@ tanuj-yadav建议大多数二维数组的工作正常,只是分配一个nXm长度的存储块并做非常简单的索引算术arr [i * c + j]。

另一种常见的方法是阵列数组(又名破碎阵列)。这就像列表清单一样,并且每行(或列)都用malloc完成。新版本