1.4.21

1.4.21 #

解答 #

直接将 Contains() 实现为二分查找即可。

代码 #

/// <summary>
/// 检查数组中是否存在指定元素。
/// </summary>
/// <param name="key">要查找的值。</param>
/// <returns>存在则返回 true,否则返回 false。</returns>
public bool Contains(int key)
{
    return Rank(key, 0, this.a.Length - 1) != -1;
}

/// <summary>
/// 二分查找。
/// </summary>
/// <param name="key">关键值。</param>
/// <param name="lo">查找的起始下标。</param>
/// <param name="hi">查找的结束下标。</param>
/// <returns>返回关键值的下标,如果不存在则返回 -1。</returns>
public int Rank(int key, int lo, int hi)
{
    while (lo <= hi)
    {
        int mid = (hi - lo) / 2 + lo;
        if (key < this.a[mid])
            hi = mid - 1;
        else if (key > this.a[mid])
            lo = mid + 1;
        else
            return mid;
    }
    return -1;
}