代码随想录算法训练营17期day13-python

一、滑动窗口最大值

'''
给你一个整数数组 nums,有一个大小为k的滑动窗口从数组的
最左侧移动到数组的最右侧。你只可以看到在滑动窗口内的 k个数字。
滑动窗口每次只向右移动一位。
返回 滑动窗口中的最大值 。
'''


c'''
给你一个整数数组 nums,有一个大小为k的滑动窗口从数组的
最左侧移动到数组的最右侧。你只可以看到在滑动窗口内的 k个数字。
滑动窗口每次只向右移动一位。
返回 滑动窗口中的最大值 。
'''


class Solution:
    def maxSlidingWindow(self, nums: list[int], k: int) -> list[int]:
        # 如果数组为空或 k = 0,直接返回空
        if not nums or not k:
            return []
        # 如果数组只有1个元素,直接返回数组
        if len(nums) == 1:
            return nums

        # 初始化队列和结果,队列存储数组的下标
        queue = []  # 模拟队列,存储数组的下标
        res = []

        for i in range(len(nums)):
            # 如果当前队列最左侧存储的元素(该元素为nums元素对应的下标)等于 i-k 的值,代表目前队列已满。
            # 但是新元素需要进来,所以列表最左侧的下标出队列
            if queue and queue[0] == i - k:
                queue.pop(0)

            # 对于新进入的元素,如果队列前面的数比它小,那么前面的都出队列
            while queue and nums[queue[-1]] < nums[i]:
                queue.pop()
            # 新元素入队列
            queue.append(i)

            # 当前的大值加入到结果数组中
            if i >= k - 1:
                res.append(nums[queue[0]])

        return res

二、前k个高频元素(还没自己写出来,后面抽空写了再更新)

你可能感兴趣的:(python,算法,leetcode)