📌  相关文章
📜  用左侧最小的元素替换每个元素(1)

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

用左侧最小的元素替换每个元素

在编程中,有时候需要用左侧最小的元素来替换每个元素,这可以通过以下方法实现。

方法一:暴力法

暴力法是最简单直接的方法。对于每个元素,从它左侧的所有元素中找到最小的元素并替换它。时间复杂度为$O(N^2)$。

def replace_with_left_min(arr):
    n = len(arr)
    for i in range(n):
        left_min = float('inf')
        for j in range(i):
            left_min = min(left_min, arr[j])
        arr[i] = left_min
    return arr
方法二:前缀最小值

前缀最小值是指对于数组中每个元素,它左侧所有元素的最小值。我们可以预处理出一个前缀最小值数组,然后用它来替换每个元素。时间复杂度为$O(N)$。

def replace_with_left_min(arr):
    n = len(arr)
    min_prefix = [float('inf')] * n
    for i in range(n):
        if i == 0:
            min_prefix[i] = arr[i]
        else:
            min_prefix[i] = min(min_prefix[i - 1], arr[i])
    for i in range(n):
        arr[i] = min_prefix[i - 1]
    return arr
方法三:单调栈

我们可以使用单调栈来找到每个元素左侧最小的元素。单调栈就是一个满足特定单调性质的栈。我们可以维护一个存放数组下标的单调递增栈,栈中元素代表的是在其右侧找不到更小的元素。

具体操作是,对于每个元素:

  1. 将栈中比当前元素大的元素全部弹出。
  2. 如果栈为空,则当前元素左侧没有更小的元素,将其替换为$-1$。
  3. 否则,栈顶元素就是当前元素左侧最小的元素,将其替换为栈顶元素。

时间复杂度为$O(N)$。

def replace_with_left_min(arr):
    n = len(arr)
    stack = []
    for i in range(n):
        while stack and arr[stack[-1]] >= arr[i]:
            stack.pop()
        if not stack:
            arr[i] = -1
        else:
            arr[i] = arr[stack[-1]]
        stack.append(i)
    return arr

以上就是三种用左侧最小的元素替换每个元素的方法,你可以根据情况选择最适合自己的方法。