📜  大于 X 的最小数是 K 周期(1)

📅  最后修改于: 2023-12-03 15:23:43.783000             🧑  作者: Mango

寻找大于X的最小数

有时候,我们需要在数字序列中找到大于给定数字X的最小数。这是一个很常见的需求,例如在求取质数时就需要寻找大于当前已知最大质数的下一个质数。

方法一:暴力枚举

最直观的想法是从X+1开始逐个枚举,直到找到第一个大于X的数字。这种方法的时间复杂度为O(N),可行性取决于待遍历的数字范围大小。

def find_next_number_brute_force(X, numbers):
    for num in numbers:
        if num > X:
            return num
    return -1 # 如果找不到则返回-1或None
方法二:二分查找

如果数字序列已经按从小到大排序,我们可以使用二分查找的方法来寻找大于X的最小数。这种方法的时间复杂度为O(logN),适用于数字范围很大的情况。

def find_next_number_binary_search(X, numbers):
    left, right = 0, len(numbers) - 1
    while left <= right:
        mid = (left + right) // 2
        if numbers[mid] <= X:
            left = mid + 1
        else:
            right = mid - 1
    return numbers[left] if left < len(numbers) else -1 # 如果找不到则返回-1或None
方法三:周期性查找

如果我们知道大于X的最小数有一定的周期性,即每隔K个数字就会出现一个大于X的数字,那么我们可以利用这个特点,每隔K个数字查找一次,直到找到一个大于X的数字。这种方法的时间复杂度为O(K),适用于周期性很强的情况。

def find_next_number_periodic(X, K):
    num = (X // K + 1) * K
    return num if num > X else num + K # 如果找不到则返回-1或None

以上三种方法都可以寻找大于X的最小数,根据不同的情况选择不同的方法可以在时间复杂度和代码复杂度之间做出权衡。