讨论社区

【三数之和】提交后发现力扣系统错误

下面两条语句必须分开,如下面紧挨着写就提交错误,如果*returnSize = 0;放在最前面就正常了。是力扣系统的错误吧????

   *returnSize = 0;

    result[*returnSize] = (int *)malloc(sizeof(int) * 3);


下面是答案:

// 快速排序,比较函数,满足下面条件则互换,故属于从小到大排序

int cmpfunc(const void *a, const void *b)

{

    return *(int *)a - *(int *)b; 

}


/**

 * 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().

 */

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

    int **result;

    int begin;

    int end;

    int sum;

    if (numsSize == 0)

    {

        return NULL;

    }

    // result为二级指针,其内容result[0],result[1],result[2]均为int *型类型,故result申请内存大小为n个int *大小

    // 此时,result[0],result[1],result[2]均为NULL指针

    //printf("numsSize %d \n", numsSize);

    // printf("(sizeof(int *) * ((numsSize + 1) * RESULT_ROW)) =  %d \n", (sizeof(int *) * ((numsSize + 1) * RESULT_ROW)));

    result = (int **)malloc(sizeof(int *) * ((numsSize + 1) * 6));

    if (result == NULL)

    {

        return NULL;

    }


    // 按照题目说明给returnColumnSizes分配内存,输出结果是多少组

    *returnColumnSizes = (int *)malloc(sizeof(int) * ((numsSize + 1) * 6));

    if (*returnColumnSizes == NULL)

    {

        return NULL;

    }

    

    // 对原始整数数组进行快速排序

    qsort(nums, numsSize, sizeof(int), cmpfunc);

    // display(nums, numsSize);


    // 第一组result[0]结果的内存分配完毕

    *returnSize = 0;   // =================== 这个赋值语句必须再往前提几行,否则这里提交会失败的。

    result[*returnSize] = (int *)malloc(sizeof(int) * 3);

    if (result[*returnSize] == NULL)

    {

        return NULL;

    }


   for (int i = 0; i < numsSize; i++)

    {

        begin = i + 1;

        end = numsSize - 1;  


        // 仅需要遍历到[负数,0]即可,正数已经重复了, 结束

        if (nums[i] > 0)

        {

            break;

        }

        // 因为已经排序,故遇到相同的数字可以跳过了

        if (i > 0 && (nums[i] == nums[i - 1]))

        {

            continue;

        }


        // 通过从[begin,end]夹挤的方式找到结果       

        while ( begin < end)

        {            

            sum = nums[i] + nums[begin] + nums[end];

            if (sum < 0)

            {

                /* 已经小于0了,则负数需要变小 */

                begin++;

            } 

            else if (sum > 0){

                /* 已经大于0了,则正数需要变小 */

                end--;

            }

            else

            {

                /* 找到了, 存储结果 */

                printf("nums[i] = %d, nums[begin] = %d, nums[end] = %d \n", nums[i], nums[begin], nums[end]);

                result[*returnSize][0] = nums[i];

                result[*returnSize][1] = nums[begin];

                result[*returnSize][2] = nums[end];

                (*returnColumnSizes)[*returnSize] = 3;

                (*returnSize)++;

                result[*returnSize] = (int *)malloc(sizeof(int) * 3);                

                // 夹挤过程中,如果发现begin和begin-1相等则跳过

                while ((nums[begin] == nums[++begin]) && (begin < end)){}

                 // 夹挤过程中,如果发现end和end-1相等则跳过  

                while ((nums[end] == nums[--end]) && (begin < end)) {}

            }

        } 

    }

    return result;    

}



0 人关注了该问题 关注

0

776854974m • 6天前

感谢您的反馈,这个题是因为在 return NULL 的时候也要指定 returnSize。

后续刷题学习中遇到问题,您可通过阅读题解解决您做题中的一些困惑,也可至 力扣圈子 进行题目交流,以获得更好的支持哟~

0 个讨论

您需要登录后才可回复
0

wt0427 • 1周前

上述提交后提示错误为:

执行出错信息:Line 240: Char 15: runtime error: load of null pointer of type 'int *' (__Serializer__.c)


修改如下:

*returnSize = 0;  // 必须放到这个位置就正常了,力扣系统问题。



【正确答案】

// 快速排序,比较函数,满足下面条件则互换,故属于从小到大排序

int cmpfunc(const void *a, const void *b)

{

    return *(int *)a - *(int *)b; 

}


/**

 * 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().

 */

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

    int **result;

    int begin;

    int end;

    int sum;

    *returnSize = 0;  // 必须放到这个位置

    if (numsSize == 0)

    {

        return NULL;

    }

    // result为二级指针,其内容result[0],result[1],result[2]均为int *型类型,故result申请内存大小为n个int *大小

    // 此时,result[0],result[1],result[2]均为NULL指针

    //printf("numsSize %d \n", numsSize);

    // printf("(sizeof(int *) * ((numsSize + 1) * RESULT_ROW)) =  %d \n", (sizeof(int *) * ((numsSize + 1) * RESULT_ROW)));

    result = (int **)malloc(sizeof(int *) * ((numsSize + 1) * 6));

    if (result == NULL)

    {

        return NULL;

    }


    // 按照题目说明给returnColumnSizes分配内存,输出结果是多少组

    *returnColumnSizes = (int *)malloc(sizeof(int) * ((numsSize + 1) * 6));

    if (*returnColumnSizes == NULL)

    {

        return NULL;

    }

    

    // 对原始整数数组进行快速排序

    qsort(nums, numsSize, sizeof(int), cmpfunc);

    // display(nums, numsSize);


    // 第一组result[0]结果的内存分配完毕

    //*returnSize = 0; // 不能放到这个位置,不清楚为什么,力扣系统问题

    result[*returnSize] = (int *)malloc(sizeof(int) * 3);

    if (result[*returnSize] == NULL)

    {

        return NULL;

    }


   for (int i = 0; i < numsSize; i++)

    {

        begin = i + 1;

        end = numsSize - 1;  


        // 仅需要遍历到[负数,0]即可,正数已经重复了, 结束

        if (nums[i] > 0)

        {

            break;

        }

        // 因为已经排序,故遇到相同的数字可以跳过了

        if (i > 0 && (nums[i] == nums[i - 1]))

        {

            continue;

        }


        // 通过从[begin,end]夹挤的方式找到结果       

        while ( begin < end)

        {            

            sum = nums[i] + nums[begin] + nums[end];

            if (sum < 0)

            {

                /* 已经小于0了,则负数需要变小 */

                begin++;

            } 

            else if (sum > 0){

                /* 已经大于0了,则正数需要变小 */

                end--;

            }

            else

            {

                /* 找到了, 存储结果 */

                printf("nums[i] = %d, nums[begin] = %d, nums[end] = %d \n", nums[i], nums[begin], nums[end]);

                result[*returnSize][0] = nums[i];

                result[*returnSize][1] = nums[begin];

                result[*returnSize][2] = nums[end];

                (*returnColumnSizes)[*returnSize] = 3;

                (*returnSize)++;

                result[*returnSize] = (int *)malloc(sizeof(int) * 3);                

                // 夹挤过程中,如果发现begin和begin-1相等则跳过

                while ((nums[begin] == nums[++begin]) && (begin < end)){}

                 // 夹挤过程中,如果发现end和end-1相等则跳过  

                while ((nums[end] == nums[--end]) && (begin < end)) {}

            }

        } 

    }

    return result;    

}



0 个讨论

您需要登录后才可回复
您需要登录后才可以回复