You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

求助:在有序整数列表中查找小于指定数的最大值

有序整数列表中查找小于指定数值的最大值的正确实现

你当前用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

逻辑说明

  1. BinarySearch返回值规则:

    • 找到与number相等的元素时,返回该元素的非负索引;
    • 未找到时,返回-(插入点) -1,其中插入点是第一个大于number的元素在列表中的位置。
  2. 核心逻辑:

    • 找到相等元素时:取该元素的前一个元素(若存在),因为需求是严格小于number;
    • 未找到相等元素时:插入点的前一个元素就是列表中最大的小于number的元素(若插入点大于0,说明存在这样的元素)。

边界情况处理

  • 当number小于列表所有元素时:插入点为0,提示无符合条件元素;
  • 当number等于列表第一个元素时:无更小的元素,提示无符合条件元素;
  • 当number大于列表所有元素时:插入点等于列表长度,插入点-1就是最后一个元素的索引,返回最后一个元素。

内容的提问来源于stack exchange,提问作者pantonis

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.11 17:25:15