【hot100篇-python刷题记录】【滑动窗口最大值】

发布于:2024-08-23 ⋅ 阅读:(122) ⋅ 点赞:(0)

R6-子串篇

目录

Max

Sort

单调队列法:

Max

完了,我好像想到python的max

class Solution:
    def maxSlidingWindow(self, nums: List[int], k: int) -> List[int]:
        ret=[]
        left,right=0,k
        while right<=len(nums):
            ret.append(max(nums[left:right]))
            right+=1
            left+=1
        return ret

 居然超时

分析一下时间复杂度

外层循环的次数:外层循环会遍历整个数组 nums,每次增加 left 指针。循环的次数是 len(nums) - k + 1,因为当 left 到达 len(nums) - k 时,窗口的右边界 right 将是 len(nums),这是窗口能滑动的最后一个位置。
内层 max 函数的调用:在每次外层循环中,max 函数会被调用,以找到当前窗口中的最大值。由于窗口的大小是固定的 k,因此每次调用 max 函数的时间复杂度是 O(k)。
结合这两个方面,我们可以得到以下的时间复杂度:

外层循环的次数是 len(nums) - k + 1,每次循环中,我们调用 max 函数,其时间复杂度是 O(k)。因此,总的时间复杂度是:

O((len(nums) - k + 1) * k)

这可以简化为:

O((n - k + 1) * k)

其中 n 是数组 nums 的长度。

如果 k 相对于 n 来说是常数,那么时间复杂度可以进一步简化为:

O(n * k)

这是因为 k 被视为常数,因此可以忽略。

综上所述,给定代码的时间复杂度是 O(n * k)。

Sort

还想用sort蒙混过关哈哈哈

class Solution:
    def maxSlidingWindow(self, nums: List[int], k: int) -> List[int]:
        ret=[]
        left,right=0,k
        while right<=len(nums):
            sort_nums=sorted(nums[left:right])
            ret.append(sort_nums[-1])
            right+=1
            left+=1
        return ret

 一样超时

只能尽可能少的-地在内层循环中搜索值

我也这样想过

这个题解解决了现有的问题

本题难点:怎么将内层的查找最大值,O(k)压缩至O(1)

单调队列法:

直接看代码吧

class Solution:
    def maxSlidingWindow(self, nums: List[int], k: int) -> List[int]:
        #创建队列
        deque=collections.deque()
        ret,n=[],len(nums)
        for i,j in zip(range(1-k,n+1-k),range(n)):
            #删除deque中对应的nums[i-1]
            if i>0 and deque[0]==nums[i-1]:
                deque.popleft()
            #保持deque递减
            while deque and deque[-1]<nums[j]:
                deque.pop()
            deque.append(nums[j])
            #记录窗口最大值
            if i>=0:
                ret.append(deque[0])
        return ret

真的太强了,get到单调栈! 


网站公告

今日签到

点亮在社区的每一天
去签到