📜  数组中任何元素之前的最大倍数(1)

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

数组中任何元素之前的最大倍数

在数组中,找到每个元素之前的最大倍数是一个常见的问题。这个问题的解决方案可以使用暴力方法,但这并不是最优解。本文将向你展示几种优秀的解决方案来解决这个问题。

暴力方法

暴力方法是通过两个循环来解决问题的。我们将从第一个元素开始,依次找到每个元素之前的最大倍数。

def find_max_multiple(nums):
    result = []
    for i in range(len(nums)):
        max_multiple = 0
        for j in range(i):
            if nums[i] % nums[j] == 0 and nums[j] > max_multiple:
                max_multiple = nums[j]
        result.append(max_multiple)
    return result

该算法的时间复杂度为 $O(n^2)$。

优化方法

我们可以通过一个单调递减栈来解决这一问题。我们从左到右遍历数组中的每个元素。如果栈顶元素是该元素的因数,则该元素的最大倍数就是栈顶元素。如果栈顶元素不是该元素的因数,则弹出该元素,直到找到栈顶元素作为该元素的因数,或者栈为空。

def find_max_multiple(nums):
    stack = []
    result = [-1] * len(nums)
    for i in range(len(nums)):
        while stack and nums[stack[-1]] < nums[i]:
            result[stack.pop()] = nums[i]
        stack.append(i)
    return result

该算法的时间复杂度为 $O(n)$。

测试代码

我们可以使用一个简单的测试代码来测试上述两种算法的正确性:

def test_find_max_multiple():
    nums = [1, 2, 3, 4, 5, 6, 7, 8, 9]
    assert find_max_multiple(nums) == [-1, 1, 2, 2, 4, 3, 6, 4, 8]
    nums = [3, 1, 2, 4, 5, 8, 6, 7, 9]
    assert find_max_multiple(nums) == [-1, -1, 3, 3, 4, -1, 8, 8, -1]

上述测试代码验证了两种算法的正确性,其中 assert 语句确保函数的输出和预期的输出相同。

结语

在本文中,我们学习了如何找到数组中任何元素之前的最大倍数。我们介绍了两种解决方案:暴力方法和单调递减栈。另外,我们还编写了一个简单的测试代码来验证算法的正确性。