leetcode第46题中int** returnColumnSizes是什么(语言:c)

问题描述 投票:0回答:1

这个问题是基于 leetcode 问题 46:排列。

为了方便起见,复制问题: 给定一个由不同整数组成的数组 nums,返回所有可能的排列。您可以按任意顺序返回答案。

限制:

1 <= nums.length <= 6 -10 <= nums[i] <= 10 All the integers of nums are unique.

我是 C 初学者,我正在努力提高我的指针和 malloc 技能。我对此没有太多经验,所以这个问题对我来说很难。

Leetcode 给出了一组你无法更改的输入,而最后一个输入给我带来了一些麻烦。这就是函数。

int** permute(int* nums, int numsSize, int* returnSize, int** returnColumnSizes)

我已经找到了这个问题的“解决方案”,我检查了 VS 代码中的示例。这就是解决方案。

#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#include <string.h>

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

/*
numsSize is max 6.
*/
void backTrack(int** res, int* nums, int numsSize, int* permutation, int permutationSize, bool* used, int* numberadded);

int** permute(int* nums, int numsSize, int* returnSize, int** returnColumnSizes) {

    // Determine resturnSize
    int factorialLookUpTable[6] = {1,2,6,24,120,720};
    *returnSize = factorialLookUpTable[numsSize-1];

    // Malloc
    int **returnedArray = malloc(sizeof(int*)* (*returnSize)); // An array that hold 'returnSize' pointers.

    // Inititalizing the arrays inside returnedArray
    for(int i = 0; i< *returnSize; i++){
        returnedArray[i] = malloc(sizeof(int)* numsSize);
    }

    int* permutation = malloc(numsSize*sizeof(int));
    bool* used = calloc(numsSize, sizeof(bool));
    int numberAdded = 0;

    backTrack(returnedArray, nums, numsSize, permutation, 0, used, &numberAdded);

    return returnedArray;
    
}

void backTrack(int** res, int* nums, int numsSize, int* permutation, int permutationSize, bool* used, int* numberadded){


    if (permutationSize == numsSize){
        // Add the permutation to the result.
        memcpy(res[*numberadded],permutation,numsSize*sizeof(int));
        *numberadded += 1;
        return;

    }

    // Go through all digits and combinations.
    for (int i = 0; i < numsSize; i++){
        if (! used[i]){

            used[i] = true;
            permutation[permutationSize] = nums[i];
            permutationSize++;

            backTrack(res, nums, numsSize, permutation, permutationSize, used, numberadded); // recursion

            used[i] = false;
            permutation[permutationSize-1] = 0;
            permutationSize--;

        }
        
    }

}

对我来说最大的问题是设置“res”并在其中存储数据,以便可以以简单的方式提取数据。现在这个解决方案“有效”(至少我的例子有效),但 leetcode 给出了错误: “第 241 行:字符 15:运行时错误:加载‘int’类型的空指针 [Serializer.c]”。

我的猜测是我必须在某个地方使用 returnColumnSizes,但我不知道它是什么意思(因为它是一个指向指针的指针)。谁能给我一些关于如何改进这段代码以及如何解决它的建议?谢谢

c pointers malloc permutation
1个回答
0
投票

什么是 int** returnColumnSizes?

调用函数(您无权访问)将执行类似的操作

int values[] = {5, 3, -1, 0, -2, 8};
int rows, *cols;

int **y = permute(values, 6, &rows, &cols);
for (int row = 0; row < rows; row++) {
    // check y[row];
    for (int col = 0; col < cols[row]; col++) {
        // check y[row][col]
   }
}
© www.soinside.com 2019 - 2024. All rights reserved.