📌  相关文章
📜  为数组中的每个元素找到最接近的较小值(1)

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

为数组中的每个元素找到最接近的较小值

在编程中,有时候需要对一个数组中的每个元素找到最接近它的较小值。例如,我们需要找到一个数组中每个元素左边第一个比它小的数。

本文将介绍两种常见的解决方法:暴力法和单调栈。

暴力法

暴力法就是对于数组中的每个元素,都循环查找它左边是否有比它小的数字。这种方法的时间复杂度是O(n^2),因为对于每个元素,需要查找其左边所有的数字。

下面是一个用暴力法解决此问题的示例代码:

def find_closest_small_value(nums):
    res = []
    for i in range(len(nums)):
        tmp = -1
        for j in range(i):
            if nums[j] < nums[i]:
                tmp = nums[j]
        res.append(tmp)
    return res
单调栈

单调栈是一种特殊的数据结构,可以在时间复杂度为O(n)的情况下解决此问题。单调栈的特点是栈中的元素是单调递增或单调递减的。在此问题中,我们需要找到左边第一个比当前元素小的数,因此我们可以使用单调递增的栈存储数组中的元素,当我们遇到一个比栈顶元素小的数时,就能找到栈顶元素的左边第一个比其小的数。

下面是一个用单调栈解决此问题的示例代码:

def find_closest_small_value(nums):
    res = []
    stack = []
    for i in range(len(nums)):
        while stack and stack[-1] >= nums[i]:
            stack.pop()
        if stack:
            res.append(stack[-1])
        else:
            res.append(-1)
        stack.append(nums[i])
    return res

在这个代码中,我们使用一个栈来存储数组中的元素。我们循环遍历数组中的每个元素,如果栈不为空且当前元素比栈顶元素小,我们就弹出栈顶元素,直到栈为空或栈顶元素比当前元素小。弹出元素过程中,我们可以将被弹出的元素的左边第一个比它小的数记录到结果数组中。最后,把当前元素压入栈中。

总结

本文介绍了两种方法解决数组中每个元素找到最接近的较小值的问题。暴力法虽然简单,但时间复杂度高。单调栈虽然需要借助于数据结构,但时间复杂度较低。在实际应用中,应根据具体情况选择使用哪种方法。