当前位置: 首页 > news >正文

分发饼干之 双数组匹配问题 (双指针 or 二分)

文章目录

    • 455.分发饼干
    • 2410.运动员和训练师的最大匹配数

455.分发饼干

在这里插入图片描述
在这里插入图片描述

  • 思路分析:根据贪心策略,肯定是胃口g[i]匹配大于等于它的最小的饼干s[i],同时,还需要考虑,一个饼干只能给一个胃口,所以我们不能重复分配
  • 由于涉及到大小问题,所以,我们对数组gs都先进行升序排序

二分思路来源

  • 如果直接暴力求解,也就是对于孩子胃口g[i],都在饼干数组中,重头开始遍历查找,那么时间复杂度会来到o(n^2),肯定是会超时的
  • 考虑到我们的目标是对于每一个孩子的胃口g[i]找到第一个还没被分配的>=g[i]的s[i],所以我们可以使用限制范围二分进行求解,在这里介绍这个bisect_left(a,x,lo=0,hi=len(a),可以通过lohi对于搜索的范围进行限定,其中总的范围是一个左闭右开的情况[0,len(a))
  • 这里有一个提前终止的情况,也就是当较小的g[i]都无法找到合适的s[j](也就是bisect_left方法返回数组长度),那么我们可以提前终止
import bisect
class Solution:def findContentChildren(self, g: List[int], s: List[int]) -> int:kid = len(g)bin = len(s)ans = 0 g.sort()s.sort()# 二分,但是有范围的二分ans = 0 curleft = 0 for i,c in enumerate(g):index = bisect.bisect_left(s,c,lo=curleft)if index == bin:breakans += 1curleft = index + 1return ans

双指针

  • 考虑到暴力的做法的时间复杂度是o(n^2),并且浪费的时间在于一些重复的查找过程,所以我们可以考虑使用双指针记录当前的匹配到的孩子的下标,通过对饼干的一次遍历,我们就可以得到最终的结果
  • 出发的角度,其实可以使用变量记录当前的孩子,然后遍历饼干,另一种思路是记录当前的饼干,然后遍历孩子。比较之后,发现第一种思路比较好,因为最终孩子的下标就是最终的答案
  • 对于双指针的到底使用cur变量记录什么,以及枚举孩子还是饼干,这个是不能搞错的,如何理解?我们的任务是给孩子分饼干,分配的策略是对于每一个孩子分配满足情况的最小的饼干,所以cur记录的是当前分配到的孩子,为了找到合适的饼干,所以我们需要枚举饼干
class Solution:def findContentChildren(self, g: List[int], s: List[int]) -> int:kid = len(g)bin = len(s)ans = 0 g.sort()s.sort()# 当前孩子的下标curkid = 0 for i,c in enumerate(s):if curkid < kid and g[curkid] <= c :curkid += 1return curkid

2410.运动员和训练师的最大匹配数

2410.运动员和训练师的最大匹配数

在这里插入图片描述

在这里插入图片描述

  • 思路分析:这题和分发饼干思路是一样的,当然这里我们的任务是给运动员分配训练师,所以cur记录的是当前分配到的运动员的下标,我们需要枚举训练师
class Solution:def matchPlayersAndTrainers(self, players: List[int], trainers: List[int]) -> int:n = len(players)players.sort()trainers.sort()curplayer = 0 for c in trainers:if curplayer < n and  players[curplayer] <= c:curplayer+=1return curplayer

相关文章:

  • 【质量管理】现代TRIZ中问题识别中的功能分析——相互接触分析
  • 【算法题】荷兰国旗问题[力扣75题颜色分类] - JAVA
  • Rust 学习笔记:关于枚举与模式匹配的练习题
  • 从0搭建Transformer
  • 大学之大:瑞典皇家理工学院2025.5.2
  • 纯原生Java实现:获取整个项目中指定接口所有的实现类
  • 柔性超声耦合剂的选择与设计-可穿戴式柔性超声耦合剂面临的难题
  • [面试]SoC验证工程师面试常见问题(三)
  • 冯·诺依曼体系:现代计算机的底层逻辑与百年传承
  • 深度学习框架PyTorch——从入门到精通(YouTube系列 - 4)——使用PyTorch构建模型
  • 实现水平垂直居中的多种方法
  • 多模态RAG演进-MRAG1.0->MRAG2.0->MRAG3.0
  • 【验证技能】VIP项目大总结
  • C++派生类核心机制:类型转换与对象复制控制深度剖析
  • 通信协议记录仪-产品规格书
  • 如何让通义千问大模型支持结构化输出?
  • 使用xlwings将两张顺序错乱的表格进行数据核对
  • NVIDIA Omniverse在数字孪生中的算力消耗模型构建方法
  • C++ std::initializer_list 详解
  • 为美好的XCPC献上典题 ABC359 G - Sum of Tree Distance(根号分治)
  • 青海大学常务副校长(正厅级)任延明已任省卫健委党组书记
  • 李在明涉嫌违反《公职选举法》案将于15日进行首次重审公审
  • 阿曼外交部:美伊谈判因故推迟
  • 视频丨英伟达总裁黄仁勋:美勿幻想AI领域速胜中国
  • 杨轶群任莆田市荔城区人民政府副区长
  • 中国武术协会原主席张耀庭逝世,曾促成电影《少林寺》拍摄