这个问题是基于 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,但我不知道它是什么意思(因为它是一个指向指针的指针)。谁能给我一些关于如何改进这段代码以及如何解决它的建议?谢谢
什么是 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]
}
}