求助:在有序整数列表中查找小于指定数的最大值
有序整数列表中查找小于指定数值的最大值的正确实现
你当前用Aggregate的逻辑是找与目标数绝对值差最小的元素,而非“小于目标数的最大值”。比如示例中10和9的差值是1,比7和9的差值2更小,所以会错误返回10,这不符合需求。
由于你的列表是有序的,数十万条数据的场景下,最高效的方法是使用二分查找(时间复杂度O(logn)),远优于遍历整个列表的O(n)复杂度。
解决方案代码
List<int> list = new List<int> { 2, 5, 7, 10 }; int number = 9; int searchIndex = list.BinarySearch(number); int result = -1; // 可根据实际需求调整默认值 if (searchIndex >= 0) { // 找到与number相等的元素,取它的前一个元素(如果存在) if (searchIndex > 0) { result = list[searchIndex - 1]; } else { Console.WriteLine("不存在小于指定数值的元素"); } } else { // 未找到相等元素,计算插入点(第一个大于number的元素位置) int insertionPoint = ~searchIndex; if (insertionPoint > 0) { // 插入点的前一个就是小于number的最大值 result = list[insertionPoint - 1]; } else { Console.WriteLine("不存在小于指定数值的元素"); } } Console.WriteLine(result); // 输出7
逻辑说明
BinarySearch返回值规则:
- 找到与
number相等的元素时,返回该元素的非负索引; - 未找到时,返回
-(插入点) -1,其中插入点是第一个大于number的元素在列表中的位置。
- 找到与
核心逻辑:
- 找到相等元素时:取该元素的前一个元素(若存在),因为需求是严格小于
number; - 未找到相等元素时:插入点的前一个元素就是列表中最大的小于
number的元素(若插入点大于0,说明存在这样的元素)。
- 找到相等元素时:取该元素的前一个元素(若存在),因为需求是严格小于
边界情况处理
- 当
number小于列表所有元素时:插入点为0,提示无符合条件元素; - 当
number等于列表第一个元素时:无更小的元素,提示无符合条件元素; - 当
number大于列表所有元素时:插入点等于列表长度,插入点-1就是最后一个元素的索引,返回最后一个元素。
内容的提问来源于stack exchange,提问作者pantonis
相关产品推荐
相关产品推荐

