LeetCode中Dart实现寻找两个有序数组中位数遇RangeError求助
问题分析与修复
错误原因
- 索引越界问题:当两个数组总长度为奇数时,你使用
(nums3.length / 2).ceil()计算中间索引,但Dart列表采用0基索引。例如总长度为1时,(1/2).ceil()返回1,而列表仅有的元素索引是0,直接访问nums3[1]就会触发RangeError。 - 遗漏排序步骤:题目要求计算两个有序数组的中位数,但你的代码只是简单合并两个数组,没有对合并后的数组进行排序。如果输入的两个有序数组是交错的(比如
nums1=[3], nums2=[1]),合并后的数组是无序的,会导致计算出错误的中位数。
修复后的代码
class Solution { double findMedianSortedArrays(List<int> nums1, List<int> nums2) { double median = 0; List<int> nums3 = [...nums1, ...nums2]..sort(); // 合并后排序 int totalLength = nums3.length; if (totalLength % 2 == 0) { int mid = totalLength ~/ 2; median = (nums3[mid] + nums3[mid - 1]) / 2; } else { int mid = totalLength ~/ 2; // 整数除法直接得到0基中间索引 median = nums3[mid].toDouble(); } return median; } }
关键修改说明
- 合并数组时使用扩展运算符
[...nums1, ...nums2]更简洁,随后调用sort()确保合并后的数组有序,符合题目要求。 - 奇数长度场景下,用整数除法
totalLength ~/ 2直接获取正确的0基中间索引,避免ceil带来的索引越界问题。 - 统一用
totalLength代替重复计算m+n或nums3.length,提升代码可读性。
内容的提问来源于stack exchange,提问作者imadchikh
相关产品推荐
相关产品推荐

