📅  最后修改于: 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),比暴力搜索要快得多。
以上就是查找每个数组元素右侧的下一个非零数组元素的两种方法。虽然暴力搜索的时间复杂度较高,但是实现起来较为简单。而使用栈的方法虽然需要更多的思考,但是效率更高,适用于大规模的数据处理。