• 数据结构-滑动窗口


    1.长度最小的子数组

    给定一个含有 n 个正整数的数组和一个正整数 target 。找出该数组中满足其总和大于等于 target 的长度最小的 连续子数组 [numsl, numsl+1, ..., numsr-1, numsr] ,并返回其长度如果不存在符合条件的子数组,返回 0 。

    1. def minSubArrayLen(starget,nums):
    2. sum=0
    3. result=len(nums)+1 # 这个地方主要要大于数组长度,以免正好整个数组长度的和等于target
    4. l=0
    5. for i in range(len(nums)):
    6. sum +=nums[i]
    7. while sum >= target:
    8. sl=i-l+1
    9. result = min(result,sl)
    10. sum-=nums[l]
    11. l+=1
    12. if result==len(nums)+1:
    13. return 0
    14. else:
    15. return result

    2. 水果成篮

    你正在探访一家农场,农场从左到右种植了一排果树。这些树用一个整数数组 fruits 表示,其中 fruits[i] 是第 i 棵树上的水果 种类 。

    你想要尽可能多地收集水果。然而,农场的主人设定了一些严格的规矩,你必须按照要求采摘水果:

    • 你只有 两个 篮子,并且每个篮子只能装 单一类型 的水果。每个篮子能够装的水果总量没有限制。
    • 你可以选择任意一棵树开始采摘,你必须从 每棵 树(包括开始采摘的树)上 恰好摘一个水果 。采摘的水果应当符合篮子中的水果类型。每采摘一次,你将会向右移动到下一棵树,并继续采摘。
    • 一旦你走到某棵树前,但水果不符合篮子的水果类型,那么就必须停止采摘。

    给你一个整数数组 fruits ,返回你可以收集的水果的 最大 数目。

    示例 1:

    输入:fruits = [1,2,1]
    输出:3
    解释:可以采摘全部 3 棵树。
    

    示例 2:

    输入:fruits = [0,1,2,2]
    输出:3
    解释:可以采摘 [1,2,2] 这三棵树。
    如果从第一棵树开始采摘,则只能采摘 [0,1] 这两棵树。
    1. class Solution:
    2. def totalFruit(fruits):
    3. i,j=0,0
    4. res=0
    5. calssMap=defaultdict(int)
    6. classFruit=0
    7. while j < len(fruits):
    8. # 判断当前是否满足条件
    9. if calssMap[fruits[j]]==0:
    10. classFruit+=1
    11. calssMap[fruits[j]]+=1
    12. #不满足条件时移动i
    13. while classFruit>2:
    14. if calssMap[fruits[i]]==1:
    15. classFruit-=1
    16. calssMap[fruits[i]]-=1
    17. i+=1
    18. res = max(res,j-i+1)
    19. j+=1
    20. return res

    3.最小覆盖子树

    给你一个字符串 s 、一个字符串 t 。返回 s 中涵盖 t 所有字符的最小子串。如果 s 中不存在涵盖 t 所有字符的子串,则返回空字符串 "" 。

    注意:

    • 对于 t 中重复字符,我们寻找的子字符串中该字符数量必须不少于 t 中该字符数量。
    • 如果 s 中存在这样的子串,我们保证它是唯一的答案。
      输入:s = "ADOBECODEBANC", t = "ABC"
      输出:"BANC"
      解释:最小覆盖子串 "BANC" 包含来自字符串 t 的 'A'、'B' 和 'C'
    1. def minWindow(s,t):
    2. i,j=0,0 # 定义我们的指针
    3. #创建一个字典
    4. needMap=collections.defaultdic(int)
    5. #定义所需的t中的种类
    6. needCnt=len(t)
    7. res='' # 初始res为''
    8. for char in t:
    9. needMap[char]+=1 # 将t中的字母存放在字典中,同时记录字母的数量
    10. while j<len(t):
    11. if s[j] in needMap:
    12. # 如果t中字符在s中且对应值大于0,则对其值建议,同时needCnt-1
    13. if needMap[s[j]]>0:
    14. needCnt -=1
    15. needMap[s[j]] -=1
    16. # 当找到第一个满足t中字符都包含在s子区间时间,也就是needCnt=0时
    17. while needCnt==0:
    18. #更新res的值
    19. if not res or j-i+1<len(res):
    20. res = s[i:j+1]
    21. # 判断左边指针是否在needMap中,如果在也就是我们去掉一个s所含t的字符
    22. if s[i] in needMap:
    23. if needMap[s[i]]==0: # 当对应值大于0时间,needCnt+1
    24. needCnt +=1
    25. needMap[s[i]]+=1
    26. i+=1
    27. j+=1
    28. return res

  • 相关阅读:
    【安全利器SELinux快速入门系列】SELINUX配置Proftpd安全FTP服务器权限实操指南
    Java的Lambda表达式学习笔记:使用lambda表达式
    学习笔记-配置备份静态路由及优先级
    1.vuex 使用一站式
    鸿蒙原生应用元服务-访问控制(权限)开发应用权限列表二
    3Blue1Brown 安装教程
    含文档+PPT+源码等]精品微信小程序springboot服装企业人事管理系统+后台管理系统[包运行成功]Java毕业设计SSM项目源码
    【DP+贪心】跳跃游戏
    Windows下IntelliJ IDEA远程连接服务器中Hadoop运行WordCount(详细版)
    LeetCode 算法:两两交换链表中的节点 c++
  • 原文地址:https://blog.csdn.net/fhy567888/article/details/136590452