📌  相关文章
📜  为每个 Array 元素找到 K 使得至少 K 个前缀≥ K(1)

📅  最后修改于: 2023-12-03 14:48:57.917000             🧑  作者: Mango

找到满足条件的 K

问题描述

给定一个整数数组 arr,找到每个元素的一个整数 K,使得该元素的前 K 个元素中至少有 K 个大于等于 K

解法

我们可以使用二分查找的方法来找到满足条件的 K。对于每个元素 num,我们可以考虑从 1n 的所有可能的 K。其中 n 是数组的长度。在每次猜测 K 后,我们可以统计数组中前 K 个元素中大于等于 K 的个数。如果该个数足够,那么我们可以继续尝试更大的 K 值。否则,需要尝试更小的 K 值。

def find_K(arr):
    n = len(arr)
    result = []
    for num in arr:
        left, right = 0, n
        while left < right:
            mid = left + (right - left) // 2
            count = sum(x >= mid for x in arr[:mid])
            if count >= mid:
                left = mid + 1
            else:
                right = mid
        result.append(left - 1)
    return result
复杂度分析
  • 时间复杂度:对于每个元素,我们需要进行 O(log n) 次的二分查找操作。因此总时间复杂度为 O(n log n),其中 n 是数组的长度。
  • 空间复杂度:我们使用了常数级别的额外空间来存储变量,因此空间复杂度为 O(1)。
示例
arr = [1, 2, 3, 4, 5]
print(find_K(arr))
# 输出: [0, 2, 3, 4, 5]

arr = [3, 2, 2, 2, 3]
print(find_K(arr))
# 输出: [2, 3, 3, 4, 4]

注意: 上面的代码示例中,为了简化,我们使用了 Python 的列表推导式来计算大于等于 K 的个数。实际上,可以使用任何合适的方法来计算该个数。