解题思路:
如果只是想做大这件事件非常简单,在每一段都取max即可,但是显然这样当k=n/2
的时候不符合线性时间复杂度的要求,所以我们维护一个列表,放其中的k个数字,然后没加入一个新的数字的时候都对其做一定的判断,将不满足条件的元素变为false,然后pop掉最前面的元素以及前面的所有false,然后非常容易可以找到最大值。
具体代码如下:
class Solution:
def maxSlidingWindow(self, nums: List[int], k: int) -> List[int]:
res = []
if not nums:
return res
if k == 1:
return nums
self.data = [nums[0]]
for i in range(1, k):
for j in range(i)[::-1]:
if self.data[j] != False and self.data[j] <= nums[i]:
self.data[j] = False
elif self.data[j] != False and self.data[j] > nums[i]:
break
self.data.append(nums[i])
false_count = 0
while self.data[0] == False:
false_count += 1
self.data = self.data[1:]
res.append(self.data[0])
for idx in range(k, len(nums)):
#先append对应的元素并把前面的变成false
for i in range(len(self.data))[::-1]:
if self.data[i] != False and self.data[i] <= nums[idx]:
self.data[i] = False
elif self.data[i] != False and self.data[i] > nums[idx]:
break
self.data.append(nums[idx])
if false_count == 0:
self.data = self.data[1:]
else:
false_count -= 1
while self.data[0] == False:
self.data = self.data[1:]
false_count += 1
res.append(self.data[0])
return res