美文网首页
队列的最大值

队列的最大值

作者: vckah | 来源:发表于2018-05-13 10:42 被阅读0次
  • 滑动窗口的最大值
    给定一个数组和滑动窗口的最大值,找出所有滑动窗口里的最大值。例如输入[2, 3, 4, 2, 6, 2, 5, 1],滑动窗口为 3 ,那么输出 [4, 4, 6, 6, 5]。
    思路一:采用蛮力法,依次扫描每个滑动窗口的最大值。这样如果滑动窗口的大小为 k,数组长度为 n,那么时间复杂度为 O(nk),对于数据量非常大来说,这似乎不可接受。
    思路二:并不把滑动窗口的每个数值都存入队列,只是将有可能成为最大值的数值存入队列,这用到了双端队列。存入队列的是数值的下标,这样有助于判断数值是否过期,即超过了滑动窗口的大小。
# coding:utf-8
# 借助 collections 里的 deque
from collections import deque
def maxSlideWindow(nums, k):
    if k == 1:
        return nums
    qmax = deque([])
    qmax.append(0)
    res = []

    for x, y in enumerate(nums[1:], 1):
        if nums[qmax[-1]] <= y:
        # 如果数组中当前值大于队列中最后一个值,那么队列中最后一个值不可能成为当前窗口最大值
            for i in range(len(qmax)-1, -1, -1):
                if nums[qmax[i]] > y:
                    break
                else:
                    qmax.pop()
        # 如果数组中当前值小于队列中的值,那么其有可能成为窗口的最大值,将其存入队列
        qmax.append(x)
        #当qmax存在过期数据,即不在移动k范围内的,将其移除出双端队列
        if qmax[0] <= x-k:
            qmax.popleft()
        # 将每次移动窗口的最大值存储到res中
        if x >= k-1:
            res.append(nums[qmax[0]])
    return res

a = [1,2,7,7,8]
print maxSlideWindow(a, 3)
  • Minimum Size Subarray Sum
    给定一个整型数组和一个数字s,找到数组中最短的一个连续子数组,使得连续子数组的数字和sum>=s,返回这个最短的连续子数组的长度值
def minSubArrayLen(s, nums):
    """
    :type s: int
    :type nums: List[int]
    :rtype: int
    """
    if not nums:
        return 0
    r = 0
    summ = 0
    minn = None
    l = 0

    while r < len(nums):
        summ += nums[r]
        r += 1
        
        while summ >= s:
            cand = r - l
            summ -= nums[l]
            l += 1
            if minn is None:
                minn = cand
            else:
                minn = min(minn, cand)
    
    if minn is None:
        return 0
    return minn

a = [2, 3, 1, 2, 4, 3]
s = 5
print(minSubArrayLen(s, a))
  • Longest Substring Without Repeating Characters
    在一个字符串中寻找没有重复字母的最长子串,返回长度值
def lengthOfLongestSubstring(s):
        """
        :type s: str
        :rtype: int
        """
        used = {}
        max_length = start = 0
        for i, c in enumerate(s):
            if c in used and start <= used[c]:
                start = used[c] + 1
            else:
                max_length = max(max_length, i - start + 1)
            used[c] = i
        return max_length

s = 'abcdabcabcd'
print(lengthOfLongestSubstring(s))

相关文章

  • 2021-04-02算法打卡

    1、队列的最大值请定义一个队列并实现函数 max_value 得到队列里的最大值,要求函数max_value、pu...

  • 数据结构使用常识

    队列:在可以确定队列长度最大值的情况下,建议用循环队列,如果你无法预估队列的长度时,则用链队列。

  • 面试题59_2:队列的最大值

    定义一个队列,实现max方法得到队列中的最大值。 要求入列、出列以及邱最大值的方法时间复杂度都是O(1) priv...

  • LeetCode | 面试题59 - II. 队列的最大值【Py

    LeetCode 面试题59 - II. 队列的最大值【Medium】【Python】【队列】 问题 力扣 请定义...

  • Tomcat 常用配置详解

    backlog/acceptCount 默认:100 半连接队列的最大值 AbstractEndpo...

  • 队列的最大值

    滑动窗口的最大值给定一个数组和滑动窗口的最大值,找出所有滑动窗口里的最大值。例如输入[2, 3, 4, 2, 6,...

  • 队列的最大值

    题目: 题目的理解: 创建一个列表来保存数字。 python实现 提交 // END 题目太多,什么时候才能刷完呢

  • 栈&队列

    一、栈&队列总结 栈/队列的应用接雨水验证栈序列滑动窗口的最大值 栈/队列的特殊实现用两个栈实现队列用两个队列实现...

  • 2020-03-30

    针对滑动窗口最大值的思考与代码优化239解题思路,单调队列。进出队列,就是下标。 当时,想建立队列,单独提出来,以...

  • 2021-03-30极客时间打卡

    剑指 Offer 59 - II. 队列的最大值https://leetcode-cn.com/problems/...

网友评论

      本文标题:队列的最大值

      本文链接:https://www.haomeiwen.com/subject/mmjhdftx.html