📌  相关文章
📜  查找每个数组元素右侧的下一个非零数组元素(1)

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

查找每个数组元素右侧的下一个非零数组元素

当我们处理一些数组操作时,可能会遇到需要查找每个元素右侧的下一个非零元素的情况。这里介绍两种方法来实现这个功能。

方法一:暴力搜索

暴力搜索的思路很简单,对于数组中的每个元素,遍历其右侧的所有元素,直到找到第一个非零元素。如果找到了就记录下来,否则记录为-1。

代码实现如下:

def find_next(arr):
    n = len(arr)
    ans = [-1] * n
    for i in range(n):
        for j in range(i+1, n):
            if arr[j] != 0:
                ans[i] = arr[j]
                break
    return ans

该代码的时间复杂度为O(n^2),不够高效。因此我们可以考虑一种更高效的方法。

方法二:栈

我们可以维护一个栈,存储数组中的元素下标。遍历数组中的每一个元素,如果该元素不为0,则先将栈中所有比该元素小的元素弹出,并将其下标对应的答案记录为该元素的值。这是因为这些元素右侧第一个非零元素肯定是该元素。

然后将该元素的下标入栈,继续遍历下一个元素。如果下一个元素比栈顶元素大,则直接将该元素入栈。

代码实现如下:

def find_next(arr):
    n = len(arr)
    ans = [-1] * n
    stack = []
    for i in range(n):
        while stack and arr[i] > arr[stack[-1]]:
            ans[stack[-1]] = arr[i]
            stack.pop()
        stack.append(i)
    return ans

该代码的时间复杂度为O(n),比暴力搜索要快得多。

总结

以上就是查找每个数组元素右侧的下一个非零数组元素的两种方法。虽然暴力搜索的时间复杂度较高,但是实现起来较为简单。而使用栈的方法虽然需要更多的思考,但是效率更高,适用于大规模的数据处理。