2022년 7월 4일, leetcode는 하루에 하나의 질문을 확인합니다——118. Yang Hui Triangle

1. 주제 설명 및 요구 사항

118. 양희삼각이 - LeetCode

주제 설명

음수가 아닌 정수가 주어지면  numRowsYanghui Triangle의 선행사를 생성합니다  numRows .

Yang Hui Triangle에서 각 숫자는 왼쪽 위의 숫자와 오른쪽 위의 숫자의 합입니다.

예 1:

输入: numRows = 5
输出: [[1],[1,1],[1,2,1],[1,3,3,1],[1,4,6,4,1]]

예 2:

输入: numRows = 1
输出: [[1]]

힌트

  • 1 <= numRows <= 30

2. 문제 해결 아이디어

일반적인 생각:

우선, 양희의 삼각형을 볼 때 가장 먼저 생각해야 할 것은 2차원 배열입니다. 왜냐하면 양희의 삼각형의 각 숫자는 왼쪽 상단과 오른쪽 상단에 있는 숫자의 합이기 때문입니다. 다만 2차원 배열이라면 정사각형이어야 하는데 공간의 일부가 값을 저장하지 않기 때문에 동적 프로그래밍의 개념을 사용해야 한다는 점에 유의해야 한다. 먼저 포인터 배열의 보조 포인터 ret에 적용합니다. 사실 이 ret는 첫 번째 요소를 가리키는 배열인 크기 numRows의 포인터 배열을 가리킨다는 점을 제외하고는 2차원 배열의 이름과 동일합니다. 각 행의. 그런 다음 주석의 힌트에 따라 returnSize 및 returnColumnSizes에 numRows를 할당합니다.끝에 반환할 때 numRows 배열을 반환하고 각 배열에 i+1 요소를 저장하는 것이 목적입니다. 다음 단계는 이 2차원 배열에 값을 할당하는 것입니다.먼저 숫자를 저장하기 위해 각 행에 대해 i+1 저장 공간을 적용합니다. returnColumnSizes는 길이가 numRows인 정수 배열을 가리키는 보조 포인터이므로 (returnColumnSizes)[i]는 i+1과 같아야 하는 각 행의 저장 요소 수를 참조한 다음 첫 번째 행을 참조합니다. 각 행과 마지막 행에 1의 값을 할당한 다음 각 요소의 왼쪽 상단과 오른쪽 상단의 값을 더합니다. 이런 식으로 Yang Hui 삼각형이 설정됩니다.

returnSize는 정수를 가리키는 정수 포인터이고 반환된 행 수를 기록하는 데만 사용되므로 returnSize=numRows이고 returnColumnSizes는 보조 포인터로 길이가 numRows인 정수 배열을 가리키므로 (* returnColumnSizes )[i] 는 각 행의 요소 수를 나타내는 것으로 Yang Hui 삼각형 설정과는 아무런 관련이 없지만 최종 반환 결과와 관련이 있습니다.

반환된 배열의 크기를 결정해야만 공간 낭비가 발생하지 않습니다.

구체적인 단계:

1. 양휘삼각형의 저장 공간 신청
2. 반환된 배열의 개수와 배열의 원소 개수 할당
3. 양휘삼각형에 값 ​​할당
4. 각 행의 처음과 마지막 숫자를 1로 할당 , 그리고 나머지 아래는 왼쪽 위 숫자와 오른쪽 위 숫자의 합, 왼쪽 위는 [i-1][j-1], 오른쪽 위는 [i-1][j]입니다.
5. 크기에 따라 최종 결과 반환

3. 특정 코드

/**
 * Return an array of arrays of size *returnSize.//返回大小为*returnSize的数组
 * The sizes of the arrays are returned as *returnColumnSizes array.//数组的大小作为*returnColumnSizes数组返回
 * Note: Both returned array and *columnSizes array must be malloced, assume caller calls free().
 */
int** generate(int numRows, int* returnSize, int** returnColumnSizes){
    //ret相当于一个二维数组,ret[i]指向的是第i行
    int** ret=malloc(sizeof(int*)*numRows);//ret为指向大小为numRows个整形指针数组的指针
    *returnSize=numRows;
    *returnColumnSizes=malloc(sizeof(int)*numRows);//指向大小为numRows的整型数组
    for(int i=0;i<numRows;i++)//二维数组赋值
    {
        ret[i]=malloc(sizeof(int)*(i+1));//申请空间,每一行的个数应当是i+1,因此所形成的是三角形而不是正方形
        (*returnColumnSizes)[i]=i+1;//返回的数组中的每一行的元素个数
        ret[i][0]=ret[i][i]=1;//每一行的第一个元素还有最后一个元素都是1
        for(int j=1;j<i;j++)
        {
            ret[i][j]=ret[i-1][j]+ret[i-1][j-1];//每个数等于它左上方也就是[i-1][j-1]的和右上方[i-1][j]的和
        }
    }
    return ret;
}

추천

출처blog.csdn.net/m0_59800431/article/details/125603408