📅  最后修改于: 2023-12-03 15:12:35.175000             🧑  作者: Mango
这道题目需要编写一个函数,实现对于一个给定的数组 arr
,以及整数 k
,返回一个新数组,其中每个元素都是原数组中其位置相邻的 k 个元素中的最小值。
函数的函数签名应该为 min_k_values(arr: List[int], k: int) -> List[int]
,即输入一个长度为 n 的整数数组 arr,以及整数 k;输出一个长度为 n-k+1,其中每个元素 arr[i] 表示原数组的下标 i 对应的 k 个连续元素的最小值。
arr = [1, 2, 5, 3, 7, 6]
k = 3
[1, 2, 3, 3, 6]
首先,我们可以想到最简单直接的方法:对于每个元素,从其位置向左、向右遍历 k 个元素,取其中的最小值。这样的复杂度为 O(kn)。
需要注意的是,如果每次在遍历时都要重复的赋值并取最小值,会浪费大量时间和空间。我们可以使用一个双端队列(deque),记录下每个元素的位置和值。每当我们向右遍历到一个新的元素时,就将队列中不满足下标关系、以及比当前元素还要大的位置弹出。由于队列中元素是按照下标递增的顺序排列的,因此队列中左边的首元素也就是 k 个元素中的最小值。然后将队列中的元素加入结果数组,完成本次遍历。
from typing import List
from collections import deque
def min_k_values(arr: List[int], k: int) -> List[int]:
n = len(arr)
if not n or not k or k > n:
return []
q = deque()
res = []
for i in range(n):
while q and q[0][0] <= i - k:
q.popleft()
while q and q[-1][1] >= arr[i]:
q.pop()
q.append((i, arr[i]))
if i >= k-1:
res.append(q[0][1])
return res
该代码的时间复杂度为 O(n),空间复杂度为 O(k)。