合并k个有序数组的代码输出不符预期,请求问题排查
合并K个有序数组结果不符合预期的问题排查
核心问题:combine函数的索引逻辑完全混乱
你的combine函数中,合并两个有序数组的核心循环部分,索引变量的使用完全搞反了,这是导致结果顺序错误的直接原因:
原错误代码片段:
int i = 0, j = 0, n = 0; while (i < arr1.len && j < arr2.len) { if (arr1.arr[j] > arr2.arr[i]) { ret.arr[n++] = arr1.arr[j++]; } else { ret.arr[n++] = arr2.arr[i++]; } } while (j < arr1.len) { ret.arr[n++] = arr1.arr[j++]; } while (i < arr2.len) { ret.arr[n++] = arr2.arr[i++]; }
问题点:
i被用来判断是否越界arr1,但实际访问的是arr2的元素;j被用来判断是否越界arr2,但实际访问的是arr1的元素- 收尾循环中,用
j遍历arr1、i遍历arr2,完全不符合变量定义逻辑
修正后的合并逻辑:
int i = 0, j = 0, n = 0; // 按降序合并,优先取较大的元素 while (i < arr1.len && j < arr2.len) { if (arr1.arr[i] > arr2.arr[j]) { ret.arr[n++] = arr1.arr[i++]; } else { ret.arr[n++] = arr2.arr[j++]; } } // 处理arr1的剩余元素 while (i < arr1.len) { ret.arr[n++] = arr1.arr[i++]; } // 处理arr2的剩余元素 while (j < arr2.len) { ret.arr[n++] = arr2.arr[j++]; }
次要问题:长度变量存在溢出风险
combine函数中定义的长度变量使用了uint8_t类型:
uint8_t len_arr = arr1.len + arr2.len;
uint8_t的最大值是255,若两个数组总长度超过255会直接溢出,导致内存分配不足。建议改用size_t或int类型:
size_t len_arr = arr1.len + arr2.len;
可选优化:merge_k函数简化
你当前的merge_k函数一开始做了不必要的内存分配和拷贝,可以直接初始化空数组再逐个合并,减少内存操作:
ArrayWithLength merge_k(ArrayWithLength *arrs, size_t count) { ArrayWithLength ret = {NULL, 0}; for (size_t i = 0; i < count; i++) { ArrayWithLength temp2 = combine(ret, arrs[i]); free(ret.arr); ret = temp2; } return ret; }
修正后,你的测试用例会输出预期的降序结果:[9, 8, 8, 8, 8, 8, 8, 4, 2, 2, 1]
内容的提问来源于stack exchange,提问作者checkchecker
相关产品推荐
相关产品推荐

