📌  相关文章
📜  从数组中找出三元组(i,j,k),使得i <j <k和arr [i] <arr [j]> arr [k](1)

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

找出三元组 (i, j, k)

在给定的数组中,如果满足条件 i < j < k 且 arr[i] < arr[j] > arr[k],则称 (i, j, k) 为一个“山峰”。本文将介绍如何在数组中找出所有的山峰。

解法

遍历数组时,使用两个指针 i 和 j,分别指向相邻的数,同时记录是否找到了合法的山峰。具体地,当 j 移动到 i 右边时,需要满足以下条件:

  • arr[i] < arr[j]
  • arr[j] > arr[j+1]

若这两个条件都满足,我们就找到了一个合法的山峰。接着,我们不断移动 j,直到它不能再往后移动。此时,我们将 i 移动到 j 的位置,重复以上操作,直到数组末尾。

可以用如下代码来实现:

def find_peaks(arr):
    if len(arr) < 3:
        return []

    res = []
    i, j = 0, 1
    while j < len(arr) - 1:
        if arr[i] < arr[j] and arr[j] > arr[j+1]:
            res.append((i, j, j+1))
            j += 1
        else:
            i, j = j, j+1

    return res
复杂度分析
  • 时间复杂度:O(n),其中 n 是数组的长度。我们只需遍历一遍数组即可找到所有合法的山峰。
  • 空间复杂度:O(1)。除了存储结果的数组外,空间复杂度为常数。