C语言LeetCode两数之和:代码仅通过3个测试用例中的2个
两数之和暴力解法错误分析与修正
核心错误点
你代码里的int length = sizeof(nums) / sizeof(nums[0]);是根本问题:在函数参数里,nums是指针类型,不是数组,sizeof(nums)得到的是指针本身的字节长度(比如32位系统是4字节,64位是8字节),用这个值除以单个元素的大小,算出来的length完全不是数组的真实长度。
以测试用例[3,2,4]为例,这个错误计算会导致循环只遍历部分元素,自然找不到正确的配对,最后返回未初始化的占位值。你应该直接用题目传给你的numsSize参数,这已经是正确的数组元素个数了。
次要优化点
原来的双层循环里,ii从0开始会重复检查同一对元素(比如i=0,ii=1和i=1,ii=0),既浪费时间,还存在逻辑冗余。改成ii从i+1开始,就能避免重复,同时不用再判断i != ii,逻辑更简洁。
修正后的代码
int* twoSum(int* nums, int numsSize, int target, int* returnSize) { int i, ii; int *Paar = (int*)malloc(2*sizeof(int)); for(i=0; i < numsSize; i++) { // ii从i+1开始,避免重复检查同一对 for(ii = i + 1; ii < numsSize; ii++) { if(nums[i] + nums[ii] == target) { Paar[0] = i; Paar[1] = ii; *returnSize = 2; return Paar; } } } // 没找到符合条件的配对时,规范处理内存和返回值 *returnSize = 0; free(Paar); return NULL; }
修正说明
- 用
numsSize替换错误的length计算,确保循环遍历整个数组; - 内层循环从
i+1开始,减少循环次数,简化逻辑; - 增加无结果时的处理:释放申请的内存,把
returnSize设为0并返回NULL,符合LeetCode的题解要求,避免内存泄漏和返回无效值。
内容的提问来源于stack exchange,提问作者ANEXL
相关产品推荐
相关产品推荐

